Domanda

Sto cercando di usare la libreria Oracle OCI con il compilatore MINGW64. Se collego OCI.lib fornito da Oracle, il mio programma a 64 bit si arresta in modo anomalo, perché apparentemente Mingw64 non supporta il collegamento con DLL creato con VC.

La soluzione alternativa per questo sembra essere:

1) Genera un file def da oci.dll, cosa che sto facendo con Mingw64 Gendef (se uso questo comando "dlltool -z oci.def --export-symbol oci.dll" ottengo un file DEF vuoto, mentre se uso Gendef ottengo un file def populato)

2) Genera una libreria di importazione OCI.A con dlltool ("dlltool -d oci.def -l liboci.a")

Tuttavia, la libreria OCI.A che genero con Dlltool è un file vuoto. In altre opere sembra che non sia in grado di generare questa libreria OCI.A, che dovrei usare per collegare il mio programma a OCI.DLLL

Qualcuno sa come risolvere questo problema? Qualcuno è in grado di eseguire correttamente questo compito?

Grazie

Marco

È stato utile?

Soluzione

Ho appena generato liboci.a senza problemi. Probabilmente hai incasinato qualcosa o hai usato un approccio errato (dlltool -z ...). Ecco come lo fai:

  1. Scarica e installa (può costruire dalla fonte) gendef utilità:

  2. Correre gendef oci.dll (genererà oci.def);

  3. Correre dlltool -D oci.dll -d oci.def -l liboci.a (genererà liboci.a);

  4. Ora prova a collegarsi contro liboci.a.

NOTA: Per favore, assicurati che se il tuo oci.dll è mirato a X86, quindi dlltool Dovrebbe provenire dalla distribuzione MingW/MingW-W64 che mira anche a X86. Lo stesso vale per il caso X64, cioè è importante che le architetture mirate corrispondano.

Altri suggerimenti

Questo post potrebbe non applicarsi a sistemi a 64 bit per quello che so, ma funziona su Windows a 32 bit ...

Ho provato Gendef e non è riuscito a produrre un file DEF. Avendo già risolto questo problema per i miei scopi all'inizio di scrivere DLL, suggerisco di usare tiny_impdef.exe di TCC, che funziona. (TCC = Tiny C Compiler, di Fabrice Bellard, e successivamente, Grishka.) Inoltre, a differenza di Dlltool (e possibilmente Gendef), funziona se GCC ha usato -S per spogliare o no la DLL di uscita!

Utilizzare Dlltool per generare il file della libreria *.a dal def, se si utilizza GCC. TCC farà l'intera build di DLL ed EXE, usando solo due righe di comando. Ho una serie di comandi che consentirà di costruire la DLL o l'EXE da GCC o TCC, con tutte e quattro le possibili combinazioni che funzionano.

File batch di seguito, per saccheggiare a piacimento ... Sono sicuro che può essere migliorato, ma almeno funziona in modo pulito così com'è.

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

Comandi REM TCC. Crea 3 file, dll e def, quindi exe. REM E: Coding Tcc Tcc.exe -Shared E: Coding Tcc Esempi Test_Dll Test_dll.c -oe: Coding Tcc Esempi test_dll test_dll.dll rem E: codifica tcc Tcc.exe E: codifica tcc esempi test_dll test_exe.c e: codifica tcc esempi test_dll test_dll.def -oe: codifica tcc esempi test_dll test_dll.exe

Comandi REM GCC. AVVERTIMENTO! Ha ancora bisogno di Tiny_impdef.exe di TCC! E: codifica gcc bin gcc.exe -s -shared -ie: codifica gcc include -mwindows e: codifica tcc esempi test_dll test_dll.c -oe: codifica tcc esempi Test_dll test_dll.dll e: codifica tcc "tiny_impdef.exe" e: codifica tcc esempi test_dll test_dll.dll> nul e: codifica gcc Mingw32 bin dlltool.exe -d E: codifica tcc esempi test_dll test_dll.def -le: codifica tcc esempi test_dll libtest_dll.a e: codifica gcc bin gcc.exe -s -ie: codifica gcc gcc Include -mwindows e: codifica tcc esempi test_dll test_exe.c e: codifica tcc esempi test_dll libtest_dll.a -oe: codifica tcc esempi test_dll test_dll.exee

Start e: codifica tcc esempi test_dll test_dll.exe

Per completezza, ecco il codice C per il 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);
}

Mi dispiace per i Gummidgisms, ma ho dovuto iniziare da qualche parte, e non mi sono mai piaciuti Foo e Bar, o ciao e mondo ... ecco l'Exe:

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

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top