2011-10-12 4 views
3

dll을 다른 dll에 대한 의존성과 연결하고 있습니다. 64 비트 버전의 프로젝트를 연결하는 데 문제가 있습니다. 32 비트 버전에서는 mingw32를 사용하는만큼 괜찮습니다. 내가 종속 DLL과와 Mingw-W64의 64 비트 버전으로 전환 때 다음과 같은 이야기 :64bit dll mingw 연결하기

'libblabla은'나는에 의존하는 라이브러리입니다
c:/.../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible .\lib\native/libblabla.dll when searching for -llibblabla 

. 나는 그것이 64 비트 버전이고 호환되어야한다고 절대적으로 확신한다. 윙에서 버그 야?

또한 lib 파일을 사용하여 링크를 시도했지만 lib도 호환되지 않는 것으로 간주되어 dlltool에 의해 생성 된 라이브러리는 생성 된 가져 오기 테이블이 없습니다!

전적으로 이것으로 붙어 있습니다. 감사합니다.

+0

문제에 대한 해결책을 찾았습니까? 내 비슷한 오류가 반전되고있다 ... 모든 64 비트 dll에 대해 작동하고 32 비트 실패합니다. nm -t를 사용할 때 동일한 기수 오류가 발생합니다. – Jason

답변

2

첫째, 길에서 몇 가지 가능한 오해를 얻을 수 있습니다 :

  1. GCC/LD는 (제대로 수출) 32 비트 DLL 및 .lib/.a 가져 오기 및 정적 라이브러리에 링크 할 수 있습니다.
  2. GCC/ld는 올바르게 내보내는 64 비트 DLL 또는 .a 가져 오기 또는 정적 라이브러리에 연결할 수 있어야하지만 64 비트 .lib 파일은 절대 열 수 없습니다.
  3. -m32으로 건물/연결하고 있지 않습니까?

"적절하게 내보내기"라는 말은 dumpbin /exports 또는 nm -t은 DLL에서 실행할 때 내 보낸 심볼을 나타냅니다. 당신이 시도해야합니까

: GCC를 호출하지 바이너리 유틸리티에 대한 직접 호출을 통해

  1. 빌드합니다. 옵션 -shared -o name.dll -Wl,--import-lib, libname.dll.a을 시작해야합니다.

  2. 가져 오기 라이브러리를 만들 수있는 .def 파일을 생성하려면 MinGW-w64의 gendef (해당 SVN/sources의 mingw-w64-tools 디렉토리에 있음)을 사용하십시오.

이러한 경우 가져 오기 라이브러리에 심볼이 생성되지 않으면 기호가 내보내지지 않을 것입니다. 오류 메시지가 dll이 32 비트라고 말하면 이것은 놀랄 것입니다. DLL에 대한 MSYS/Cygwin의 file 명령은 무엇을 반환합니까?

+0

답변 해 주셔서 감사합니다. 외부 라이브러리에 대한 .def 파일을 생성하기 위해 dlltool을 사용하고 있습니다. 빈 파일을 생성합니다 ('EXPORT'단어는 계산하지 않습니다). 이것을 바꾸려면 어떤 단계를 밟아야합니까? 또한, 외부 라이브러리가 Visual Studio로 빌드된다는 것을 알고 있습니다. 이유가있을 수 있습니까? –

+1

nm : libblabla.dll :'nm -t libblabla.dll'을 수행 할 때 기수가 유효하지 않음 –

+0

블라디미르 : "유효하지 않은 기수"오류가 이상합니다. x86_64-w64-mingw32 용 nm을 사용하고 있습니까? 32 비트 및 64 비트 DLL에서 MSVC의'dumpbin/exports '를 시도하십시오. dlltool이 빈 def 파일을 반환하면 기호가 내보내지지 않습니다. 내 보낸 심볼은 DLL을 빌드 할 때'__cdecl (dllexport)'를 통해 표시되어야하고, 클라이언트 어플리케이션의 헤더를 포함 할 때는'__cdecl (dllexport)'로 표시되어야합니다. 이것은 비트와 상관없이 사실이어야합니다. – rubenvb