Frage

Ich versuche, die Oracle OCI -Bibliothek mit dem Compiler Mingw64 zu verwenden. Wenn ich die von Oracle bereitgestellte OCI.LIB verlinke, stürzt mein 64 -Bit -Programm ab, da anscheinend Mingw64 die Verknüpfung mit DLL mit VC nicht unterstützt.

Die Problemumgehung dafür scheint:

1) Generieren Sie eine DEF-Datei aus der OCI.dll, die ich mit Mingw64 Gendef mache (wenn ich diesen Befehl "dltool -z oci.def-export-alle-symbol oci.dll" verwende, erhalte ich eine leere DEF-Datei, Wenn ich Gendef verwende, bekomme ich eine besiedelte DEF -Datei)

2) Generieren Sie eine Importbibliothek oci.a mit dlltool ("dlltool -d oci.def -l liboci.a")

Die OCI.A -Bibliothek, die ich mit Dlltool generiere, ist jedoch eine leere Datei. In anderen Arbeiten scheint es, dass ich diese OCI.A -Bibliothek nicht generieren kann, damit ich mein Programm mit der OCI.dll verknüpft habe

Weiß jemand, wie er dieses Problem lösen kann? Kann jemand diese Aufgabe richtig ausführen?

Vielen Dank

Marco

War es hilfreich?

Lösung

Ich habe gerade erzeugt liboci.a ohne Probleme. Wahrscheinlich haben Sie etwas durcheinander gebracht oder falsche Ansatz verwendet (dlltool -z ...). So machen Sie es:

  1. Download und installieren (kann aus der Quelle erstellen) gendef Dienstprogramm:

    • Wenn Sie normalerweise haben Mingw, dann erhalten Sie es hier;
    • Wenn Sie haben Mingw-w64, dann erhalten Sie es hier.
  2. Laufen gendef oci.dll (wird erzeugen oci.def);

  3. Laufen dlltool -D oci.dll -d oci.def -l liboci.a (wird erzeugen liboci.a);

  4. Versuchen Sie nun, sich gegen zu verbinden liboci.a.

HINWEIS: Bitte stellen Sie sicher, dass wenn Ihre oci.dll ist dann auf x86 abzielt dlltool sollte von der Mingw/Mingw-W64-Verteilung stammen, die ebenfalls auf X86 abzielt. Gleiches gilt für den X64 -Fall, dh es ist wichtig, dass gezielte Architekturen übereinstimmen.

Andere Tipps

Dieser Beitrag gilt möglicherweise nicht für 64 -Bit -Systeme für alles, was ich weiß, aber er funktioniert bei 32 Bit -Fenstern ...

Ich habe Gendef ausprobiert, und es konnte keine DEF -Datei erstellt. Nachdem ich dieses Problem bereits für meine eigenen Zwecke gelöst habe, um DLLs zu schreiben, schlage ich vor, mit Tiny_impdef.exe aus TCC zu verwenden, was funktioniert. (TCC = Tiny C Compiler, von Fabrice Bellard und später Grishka.) Was mehr ist, im Gegensatz zu Dlltool (und möglicherweise Gendef) funktioniert es, ob GCC -s verwendet wurde, um die Ausgangsdll abzuziehen oder nicht!

Verwenden Sie DllTool, um die *.a -Bibliotheksdatei aus der DEF zu generieren, wenn Sie GCC verwenden. TCC wird den gesamten Build von DLL und EXE mit nur zwei Befehlszeilen durchführen. Ich habe eine Reihe von Befehlen, mit denen entweder die DLL oder die EXE von GCC oder TCC gebaut werden können, wobei alle vier möglichen Kombinationen funktionieren.

Batch -Datei unten, zum Plündern nach Belieben ... Ich bin sicher, sie kann verbessert werden, aber zumindest funktioniert sie so sauber wie soweit.

@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 -Befehle. Erstellt 3 Dateien, DLL und def, dann exe. REM E:CODINGTCCTCC.EXE -shared E:CODINGTCCEXAMPLESTest_DLLTest_DLL.c -oE:CODINGTCCEXAMPLESTest_DLLTest_DLL.dll REM E:CODINGTCC Tcc.exe e: codierung tcc euests test_dll test_exe.c e: coding tcc Beispiele test_dll test_dll.def -oe: coding tcc Beispiele test_dll test_dll.exe

REM GCC -Befehle. WARNUNG! Benötigt noch TCCs Tiny_impdef.exe! E: codierung gcc bin gcc.exe -s -shared -ie: coding gcc include -mwindows e: coding tcc Beispiele test_dll test_dll.c -oe: coding tcc psalples Test_dll test_dll.dll e: coding tcc "tiny_impdef.exe" e: coding tcc Beispiele test_dll test_dll.dll> nul e: coding gcc mingw32 bin dlltool.exe E: Codierung tcc Beispiele test_dll test_dll.def -le: coding tcc Beispiele test_dll libtest_dll.a e: coding gcc bin gcc.exe -s -ie: gcc gcc Include -mwindows e: codierung tcc Beispiele test_dll test_exe.c e: coding tcc Beispiele test_dll libtest_dll.a -oe: coding tcc Beispiele test_dll test_dll.exe.exe

Start e: codierung tcc Beispiele test_dll test_dll.exe

Für die Vollständigkeit ist hier der C -Code für die Test -DLL:

#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);
}

Tut mir leid wegen der Gummidgismen, aber ich musste irgendwo anfangen, und ich mochte Foo und Bar oder Hello und World nie ... hier ist die Exe:

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

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top