2013-05-10 2 views
1

Ruby 1.9.1 не удается построить с помощью Visual Studio 2012 (update1 и 2) из-за неразрешенных внешних элементов при создании с использованием флаг-компилятора -arch: SSE по умолчанию.Visual Studio 2012 создает нерешенные внешние элементы для xmm

cl -nologo -LD main.obj dmyext.obj msvcr110-ruby191-static.lib msvcr110-ruby191.res unicows.lib oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib -Femsvcr110-ruby191.dll -link -incremental:no -debug -opt:ref -opt:icf -implib:dummy.lib -def:msvcr110-ruby191.def -MAP:map-out.txt 
Creating library dummy.lib and object dummy.exp 
dummy.exp : error LNK2001: unresolved external symbol [email protected] 
dummy.exp : error LNK2001: unresolved external symbol [email protected] 
msvcr110-ruby191.dll : fatal error LNK1120: 2 unresolved externals 

Открытие файла определения модуля, следующие элементы данных регистра появляются в разделе экспорта:

[email protected] DATA 
[email protected] DATA 
[email protected] DATA 
[email protected] DATA 

Первые две статьи, пронумерованные с двумя символами подчеркивания не вызывают проблемы, но последние два пункта которому предшествует один знак подчеркивания, отвечают за нерешенные внешние. Вручную модифицировать файл def, чтобы все они имели два подчеркивания, похоже, устраняют проблему, но я не уверен, что это просто скрывает проблему или устраняет проблему.

Другой вариант заключается в создании флагов-компоновщика -force: нерешен, но это опасно, если на самом деле требуются нерешенные внешние.

Третий вариант исправить это заключается в компиляции с параметром -arch: IA32, который не будет создавать инструкции SSE. Однако эта рубиновая dll также построена для платформы x64, и, похоже, нет возможности успешно построить x64 с использованием альтернативной опции -arch.

Мои вопросы:

Является ли это нормальным/Ожидается, что данные XMM регистров появляются как экспорт в файле определения модуля?

Есть ли какие-либо идеи относительно того, как разрешить это для платформ Win32 и x64?

ответ

1

Эта проблема теперь решена.

Оказывается, что есть рубин скрипт называется mkexports.rb, который генерирует экспорт для msvcr110-ruby191.lib.

В функции every_export имеется строка кода, которая исключает элементы данных на основе 8 - 16 шестнадцатеричных цифр, которые успешно исключают __real данные.

next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{8,16}$/ =~ l || /^[email protected]/ =~ l 

Измененный код для Exlude элементы, основанные на 8 - 32 шестнадцатеричных цифр, которые в настоящее время исключает __xmm данные тоже.

next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{8,32}$/ =~ l || /^[email protected]/ =~ l