2014-11-03 3 views
2

DirectX SDK에서 제공되는 d3d11.lib와 같은 파일을 * .a GCC 라이브러리 형식으로 변환하는 올바른 방법은 무엇입니까? * .lib 파일을 * .a 파일로 변환하는 일반적인 reimp 메서드를 시도했지만 작동하지 않습니다.GCC 용 올바른 D3D11 라이브러리 파일 만들기

단계의 하나는 정의 파일을 만드는 작업이 포함됩니다 :

bin\reimp -d d3d11.lib 

하는의 내가이 라이브러리에 제공되어야한다 D3D11CreateDevice 기능을 사용하기를 원하는 경우를 생각 해보자. 내가 생성 된 정의 파일을 열 경우 모든 확인 것 같다 : 이것은에서와

bin\dlltool -v -d d3d11.def -l libd3d11.a 

:

LIBRARY "d3d11.dll" 
EXPORTS 
(...) 
D3D11CreateDevice 
D3D11CreateDeviceAndSwapChain 
(...) 

다음 내가 정의 파일과 원본 LIB 파일을 사용하여 * 운영자와 파일을 만들려고 사실은 유효한 라이브러리 (및 dlltool이가 자세한로 설정 오류 메시지)를 생산,하지만 난 그것을 구현해야 할 기능 D3D11CreateDevice를 사용하려고하면, 나는 오류 얻을 :

undefined reference to `D3D11CreateDevice' 

내가 N 요청하는 경우를 라이브러리 (필터 사용 그렙)에 존재하는 어떤 기호 m,이 얻을 :

D:\Tools\LIB2A>bin\nm libd3d11.a | grep D3D11CreateDevice 
File STDIN: 
00000000 I __imp__D3D11CreateDeviceAndSwapChain 
00000000 T _D3D11CreateDeviceAndSwapChain 
00000000 I __imp__D3D11CreateDevice 
00000000 T _D3D11CreateDevice 

임프 함수는 DLL 내부 D3D11CreateDevice의 실제 구현을 호출하는 기능이다. 그러나 실제 구현에는 이제 밑줄이 붙습니다.

"D3D11CreateDevice"가 정의 파일에 언급되어 있지만 "_D3D11CreateDevice"가 정의되어있는 이유는 무엇입니까?

답변

0

dlltool의 오래된 버전은 d3d11lib를 변환 할 때 모든 함수에 밑줄 문자를 추가합니다. MinGW-w64 4.9.2의 dlltool.exe를 사용하여 문제를 해결했습니다. 이 dlltool은 올바른 함수 이름을 가진 라이브러리를 생성합니다.

Microsoft에서 제공 한 일반 d3d11.lib을 다른 사람이 제공 한 헤더와 함께 사용하면 런타임에 라이브러리로 들어갈 때 SIGSEGV가 발생합니다. 이는 조사되지 않은 어떤 이유로 * .a 형식으로 변환해야 함을 의미합니다.

2

그냥 수행

copy d3d11.lib libd3d11.a

는 다른 방법으로 대신 -ld3d11의 GCC 명령 행에 X:\path\to\d3d11.lib을 사용합니다. Windows의 GNU 유틸리티는 Microsoft 도구에서 사용하는 것과 동일한 PECOFF 아카이브 형식을 사용합니다.

+0

이 사실을 알게되면 하루 종일 같이 나를 구할 수있었습니다. 고맙습니다! – Orwell

+0

그래서 .lib 파일을 직접 사용하려고했습니다. 컴파일과 링크는 잘되지만 일단 라이브러리에 들어가면 세분화 오류가 발생합니다. 결국 * lib 파일이 호환되지 않는 것 같습니다. – Orwell

+0

라이브러리가 호환되거나 링크되지 않았습니다. 나는 문제없이 DirectX SDK 라이브러리를 사용했다. 너의 문제는 다른 곳에있다. DirectX SDK 헤더를 사용하고 있습니까? 나는 Direct3D 11 헤더가 GCC와 호환되지 않는다고 생각한다. 그래서 여러분이 대신 사용하고있는 것은 무엇이든간에 (당신이 그것들을 호환 가능하게하려고 시도 했더라도) 당신이 올바르게 사용하고있는 함수를 선언하지 않았을 것이다. –