Pregunta

Estoy tratando de usar la biblioteca Oracle OCI con el compilador MINGW64. Si vinculo el OCI.lib proporcionado por Oracle, mi programa de 64 bits se bloquea, porque aparentemente MingW64 no admite el enlace con DLL creado con VC.

La solución para esto parece ser:

1) Genere un archivo DEF desde el oci.dll, lo que estoy haciendo con Mingw64 GENDEF (si uso este comando "dllTool -z oci.def --export-todo-symbol oci.dll" obtengo un archivo def vacío, Mientras que si uso GENDEF obtengo un archivo DEF poblado)

2) Genere una biblioteca de importación OCI.A con dllTool ("dllTool -d oci.def -l liboci.a")

Sin embargo, la biblioteca OCI.A que generé con DllTool es un archivo vacío. En otras obras, parece que no puedo generar esta biblioteca OCI.A, que debería usar para vincular mi programa a Oci.dll

¿Alguien sabe cómo resolver este problema? ¿Alguien puede realizar esta tarea correctamente?

Gracias

Marco

¿Fue útil?

Solución

Acabo de generar liboci.a sin ningún problema. Probablemente arruinaste algo o usaste un enfoque incorrecto (dlltool -z ...). Así es como lo haces:

  1. Descargar e instalar (puede construir desde la fuente) gendef utilidad:

  2. Correr gendef oci.dll (Generará oci.def);

  3. Correr dlltool -D oci.dll -d oci.def -l liboci.a (Generará liboci.a);

  4. Ahora intente vincular contra liboci.a.

NOTA: Por favor, asegúrese de que si su oci.dll está dirigido a x86, entonces dlltool Debe ser de la distribución MingW/MingW-W64 que también se dirige a X86. Lo mismo ocurre con el caso X64, es decir, es importante que las arquitecturas dirigidas coincidan.

Otros consejos

Es posible que esta publicación no se aplique a los sistemas de 64 bits para todo lo que sé, pero funciona en Windows de 32 bits ...

Intenté GENDEF y no pudo producir un archivo DEF. Después de haber resuelto este problema para mis propios fines al comenzar a escribir DLL, sugiero usar tiny_impdef.exe de TCC, que funciona. (TCC = Tiny C Compiler, de Fabrice Bellard, y más tarde, Grishka). ¡Lo que es más, a diferencia de DllTool (y posiblemente Gendef), funciona si GCC usó -S para quitar la salida DLL o no!

Use DllTool para generar el archivo de biblioteca *.a desde el DEF, si se usa GCC. TCC hará toda la construcción de DLL y EXE, utilizando solo dos líneas de comando. Tengo un conjunto de comandos que permitirán que el DLL o el EXE sea construido por GCC, o TCC, con las cuatro combinaciones posibles funcionando.

Archivo por lotes a continuación, para saquear a voluntad ... Estoy seguro de que puede ser mejorado, pero al menos funciona limpiamente como está.

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

Comandos REM TCC. Crea 3 archivos, DLL y DEF, luego exe. Rem e: coding tcc tcc.exe -shared e: coding tcc ejemplos test_dll test_dll.c -oe: coding tcc ejemplos test_dll test_dll.dll rem e: coding tcc tcc tcc Tcc.exe e: coding tcc ejemplos test_dll test_exe.c e: coding tcc ejemplos test_dll test_dll.def -oe: coding tcc ejemplos test_dll test_dll.exe

REM Comandos GCC. ¡ADVERTENCIA! ¡Todavía necesita Tiny_impdef.exe de TCC! E: Coding gcc bin gcc.exe -s -shared -ie: coding gcc include -mwindows e: coding tcc ejemplos test_dll test_dll.c -oe: coding tcc ejemplos Test_dll test_dll.dll e: coding tcc "tiny_impdef.exe" e: coding tcc ejemplos test_dll test_dll.dll> nul e: coding gcc mingw32 bin dllTool.exe --Dd E: Coding tcc ejemplos test_dll test_dll.def -le: coding tcc ejemplos test_dll libtest_dll.a e: coding gcc bin gcc.exe -s -ie: coding gccc Include -mwindows e: coding tcc ejemplos test_dll test_exe.c e: coding tcc ejemplos test_dll libtest_dll.a -oe: coding tcc ejemplos test_dll test_dll.exe

Inicio E: Coding tcc ejemplos test_dll test_dll.exe

Para completar, aquí está el código C para la prueba 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);
}

Perdón por los gummidgismos, pero tuve que comenzar en algún lugar, y nunca me gustó Foo y Bar, o hola y mundo ... aquí está el exe:

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

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top