2010-03-18 10 views
27

Estoy intentando vincular el LizardTech GeoExpress DSDK en mi propia aplicación. Uso gcc para que podamos compilar en plataformas. En Linux y Mac esto funciona fácilmente: proporcionan una biblioteca estática (libltidsdk.a) y encabezados, y todo lo que tenemos que hacer es usarlos.Vinculación a la DLL de MSVC desde MinGW

Compilar para Windows no es tan fácil. Han construido la biblioteca usando Microsoft Visual Studio, y usamos MinGW. He leído las preguntas frecuentes de MinGW y me encuentro con los siguientes problemas. La biblioteca es todo C++, entonces mi primera pregunta: ¿esto es posible?

El solo hecho de enlazar con el dll proporciona los errores de "referencia indefinida" para todas las llamadas de C++ (constructores, desctructores, métodos, etc.).

Sobre la base de la MinGW Wiki: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs yo debería ser capaz de utilizar la utilidad reimp para convertir un .lib en algo utilizable. Probé todos los archivos .lib proporcionados por LizardTech, y todos dan una "biblioteca de importación no válida o corrupta". He probado tanto la versión 0.4 como la 0.3 de la utilidad Reimp.

Usando el segundo método descrito en la wiki, he ejecutado pexport y dlltool sobre la dll para obtener un archivo .a, pero eso produce las mismas referencias indefinidas.

BTW: He leído la discusión a continuación. Dejó cierta ambigüedad en cuanto a si esto es posible, y dada la página MinGW Wiki parece que esto debería ser factible. Si es imposible, eso es todo lo que necesito saber. Si se puede hacer, me gustaría saber cómo puedo lograr que esto suceda.

How to link to VS2008 generated .libs from g++

Gracias!

Respuesta

22

No puede hacer esto. Han exportado clases de C++ desde su dll, en lugar de C-funciones. La diferencia es que las funciones de C++ siempre se exportan con nombres en forma desfigurada que son específicos de una versión particular del compilador.

Su dll es utilizable por msvc solo en esa forma, y ​​probablemente ni siquiera funcionará entre diferentes versiones de msvc, ya que Microsoft ha cambiado su esquema de mapeo antes.

Si tiene algún tipo de influencia, necesita hacer que cambien sus malas costumbres. De lo contrario, tendrá que usar MSVC para escribir un shim dll, que importará todas las clases y las volverá a exportar a través de las funciones c que devuelven las interfaces.

+1

Gracias, esta es exactamente la confirmación que estaba buscando. Tienen una interfaz c, y estoy buscando usar eso, pero es mucho menos poderosa que lo que está disponible en C++. También los presiono para lanzar MinGW. – IndigoFire

+5

Prefiero las versiones de mingw de, bueno, todo, ya que simplifica la implementación cuando la dependencia c-runtime es msvcrt.dll universalmente disponible, en lugar de los tiempos de ejecución específicos de la versión de estudio msvcr70.dll, msvcr71.dll, msvcr80. dll, msvcr90.dll y ahora msvcr100.dll. –

3

Estoy casi Estoy seguro de que no se puede vincular bibliotecas C++ en compiladores como ese. Lo he intentado, muy duro, pero fue hace mucho tiempo y no recuerdo los detalles. Creo que para las bibliotecas C es posible, con muchos hacks.

0

Para usar una DLL en Windows, establece un vínculo con una biblioteca de importación (no la DLL en sí). Las bibliotecas de importación suelen tener la extensión .lib (al igual que las bibliotecas estáticas). Si descarga el SDK de Windows, obtendrá bibliotecas de importación para todas las DLL del sistema.

De su pregunta, parece que ha mezclado el .dll con .lib. ¿Estás seguro de que Reimp no toma una DLL como entrada y crea una biblioteca de importación .LIB que sea compatible con MinGW?

Acabo de buscar con MinGW está en Wikipedia. Según ese artículo, MinGW viene con bibliotecas de importación redistribuibles.

+1

Basado en el wiki MinGW, reimp toma una biblioteca de importación. Ejecutarlo contra el DLL tampoco funciona, aunque lo intenté. – IndigoFire

Cuestiones relacionadas