Ruby 1.9.1 在使用默认 -arch:SSE 编译器标志构建时,由于未解析的外部因素,无法使用 Visual Studio 2012(update1 和 2)构建。
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 _xmm@41f00000000000000000000000000000
dummy.exp : error LNK2001: unresolved external symbol _xmm@7fffffffffffffff7fffffffffffffff
msvcr110-ruby191.dll : fatal error LNK1120: 2 unresolved externals
打开模块定义文件,导出部分出现如下寄存器数据项:
__xmm@80000000000000008000000000000000 DATA
__xmm@80000000800000008000000080000000 DATA
_xmm@41f00000000000000000000000000000 DATA
_xmm@7fffffffffffffff7fffffffffffffff DATA
带有两个下划线的前两项不会引起问题,但带有一个下划线的后两项负责未解决的外部问题。手动修改 def 文件,使它们都有两个下划线似乎可以解决问题,但我不确定这是否只是隐藏问题或解决问题。
另一种选择是使用链接器标志 -force:unresolved 构建,但如果实际需要未解析的外部,这很危险。
解决此问题的第三个选项是使用 -arch:IA32 选项进行编译,该选项不会生成 SSE 指令。但是,此 ruby dll 也是为 x64 平台构建的,似乎无法使用替代 -arch 选项成功构建 x64。
我的问题是:
xmm 寄存器数据作为导出出现在模块定义文件中是否正常/预期?
关于如何为 Win32 和 x64 平台解决这个问题有什么想法吗?