문제

컴파일러 Mingw64와 함께 Oracle OCI 라이브러리를 사용하려고합니다. Oracle에서 제공 한 OCI.LIB를 연결하면 64 비트 프로그램 충돌이 발생합니다. Mingw64는 VC와 생성 된 DLL과 연결을 지원하지 않기 때문입니다.

이에 대한 해결 방법은 다음과 같습니다.

1) Mingw64 Gendef에서 수행하는 OCI.dll에서 DEF 파일을 생성합니다 (이 명령 "DllTool -Z Oci.def -Export-all-Symbol OCI.dll"나는 빈 DEF 파일을 얻습니다. gendef를 사용하면 인구가 많은 DEF 파일이 나타납니다)

2) dlltool ( "dlltool -d oci.def -l liboci.a"로 가져 오기 라이브러리 OCI.A를 생성합니다.

그러나 dlltool로 생성하는 OCI.A 라이브러리는 빈 파일입니다. 다른 작품에서는이 OCI.A 라이브러리를 생성 할 수 없어서 프로그램을 OCI.DLL에 연결하는 데 사용해야합니다.

누군가이 문제를 해결하는 방법을 알고 있습니까? 누군가이 작업을 올바르게 수행 할 수 있습니까?

고맙습니다

마르코

도움이 되었습니까?

해결책

방금 생성했습니다 liboci.a 아무런 문제없이. 아마도 당신은 무언가를 엉망으로 만들거나 잘못된 접근을 사용했습니다 (dlltool -z ...). 다음은 다음과 같습니다.

  1. 다운로드 및 설치 (소스에서 빌드 할 수 있음) gendef 공익사업:

    • 평소가있는 경우 mingw, 그런 다음 얻으십시오 여기;
    • 당신이 가지고 있다면 Mingw-W64, 그런 다음 얻으십시오 여기.
  2. 운영 gendef oci.dll (생성됩니다 oci.def);

  3. 운영 dlltool -D oci.dll -d oci.def -l liboci.a (생성됩니다 liboci.a);

  4. 이제 연결을 시도하십시오 liboci.a.

노트: 제발, 당신의 경우 oci.dll 그러면 x86을 목표로합니다 dlltool x86을 대상으로하는 Mingw/Mingw-W64 분포에서 나와야합니다. x64 케이스도 마찬가지입니다. 즉, 타겟 아키텍처가 일치하는 것이 중요합니다.

다른 팁

이 게시물은 내가 아는 모든 것에 대해 64 비트 시스템에 적용되지 않을 수 있지만 32 비트 Windows에서 작동합니다 ...

Gendef를 시도했는데 DEF 파일을 생성하지 못했습니다. DLL을 쓰기 시작한 내 자신의 목적을 위해이 문제를 이미 해결 한 후에는 TCC의 tiny_impdef.exe를 사용하는 것이 좋습니다. (TCC = Tiny C 컴파일러, Fabrice Bellard 및 나중에 Grishka.) DllTool (및 아마도 Gendef)과 달리 GCC를 사용했는지 여부는 출력 DLL을 제거하는 데 작동하는지 여부가 작동하는지 여부는 작동합니다!

GCC를 사용하는 경우 dlltool을 사용하여 DEF에서 *.a 라이브러리 파일을 생성하십시오. TCC는 두 개의 명령 줄을 사용하여 DLL 및 EXE의 전체 빌드를 수행합니다. 4 개의 가능한 조합이 모두 작동하면서 GCC 또는 TCC에 의해 DLL 또는 EXE를 구축 할 수있는 명령 세트가 있습니다.

아래의 배치 파일, 의지에 대한 약탈을 위해 ... 나는 그것이 더 나아질 수 있다고 확신하지만 적어도 그것은 깨끗하게 작동합니다.

@ECHO OFF
REM This system seems to work regardless of which compiler makes the DLL or the EXE. Try to simplify for GCC.

REM TCC 명령. 3 개의 파일, dll 및 def, exe를 만듭니다. rem e : coding tcc tcc.exe -shared e : coding tcc exames test_dll test_dll.c -oe : coding tcc examples test_dll test_dll.dll rem e : coding tcc tcc.exe e : coding tcc examples test_dll test_exe.c e : coding tcc examples test_dll test_dll.def -oe : coding tcc examples test_dll test_dll.exe

REM GCC 명령. 경고! 여전히 tcc의 tiny_impdef.exe가 필요합니다! e : coding gcc bin gcc.exe -s shared -ie : coding gcc 포함 -mwindows e : coding tcc examples test_dll test_dll.c -ooe : coding tcc examples test_dll test_dll.dll e : coding tcc "tiny_impdef.exe"e : coding tcc examples test_dll test_dll.dll> nul e : coding gcc mingw32 bin dlltool.exe -Dlltool.exe -Dlltool.exe -Dlltool.exe -Dlltool.exe -Dlltool.exe -dlltllt. e : coding tcc examples test_dll test_dll.def -le : coding tcc examples test_dll libtest_dll.a e : coding gcc bin gcc.exe -s-ie : coding coding coding include -mwindows e : coding tcc examples test_dll test_exe.c e : coding tcc examples test_dll libtest_dll.a -oe : coding tcc examples test_dll test_dll.exe

시작 e : coding tcc examples test_dll test_dll.exe

완전성을 위해 테스트 DLL의 C 코드는 다음과 같습니다.

#include <windows.h>
#define DLL_EXPORT __declspec(dllexport)

DLL_EXPORT void ZoodleWurdle(){
  MessageBox (0, "Wurdle", "Zoodle", MB_ICONINFORMATION);
}

DLL_EXPORT void MangleWurzel(){
  MessageBox (0, "Mangled", "Wurzels", MB_ICONINFORMATION);
}

gummidgisms에 대해 죄송하지만 어딘가에서 시작해야했는데 Foo와 Bar, Hello와 World를 좋아하지 않았습니다 ... 여기에 exe가 있습니다.

#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top