2013-05-10 2 views
1

기본 -arch : SSE 컴파일러 플래그로 빌드 할 때 해결되지 않은 외부 때문에 Ruby 1.9.1을 Visual Studio 2012 (update1 및 2)로 빌드 할 수 없습니다. 모듈 정의 파일을 열면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 : unresolved로 빌드하는 것이지만 해결되지 않은 외부가 실제로 필요한 경우 위험합니다.

세 번째 옵션은 SSE 명령을 생성하지 않는 -arch : IA32 옵션을 사용하여 컴파일하는 옵션입니다. 그러나이 루비 dll은 x64 플랫폼 용으로도 제작되었으며 대체 -arch 옵션을 사용하여 x64를 성공적으로 빌드 할 수있는 방법이 없습니다.

내 질문은 : 정상/XMM 레지스터 데이터 모듈 정의 파일의 수출로 나타날 것으로 예상

인가?

Win32 및 x64 플랫폼에서이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변

1

이 문제가 해결되었습니다.

그것은 msvcr110-ruby191.lib에 대한 수출을 생성 mkexports.rb라는 루비 스크립트가있는 것으로 나타났다.

함수 each_export에는 __real 데이터를 성공적으로 제외하는 8 - 16 진수를 기반으로 데이터 항목을 제외하는 코드 행이 있습니다. 또한, 지금 __xmm 데이터를 제외한 32 개의 16 진수 -

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

8에 기초하여 항목을 exlude하는 코드 개정.

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