2010-03-27 13 views
9

He compilado varias bibliotecas con MingW/MSYS ... las bibliotecas estáticas generadas son siempre archivos .a. Cuando intento vincular la biblioteca con un proyecto MSVC, Visual Studio arroja 'símbolos externos no resueltos' ... Significa que la biblioteca estática .a no es compatible con MS C++ Linker. Supongo que debe convertirse a un archivo .lib compatible con MSVC.¿Cómo usar las bibliotecas compiladas con MingW en MSVC?

O bien, .a y .lib son solo archivos AR de archivos .o o .obj, de modo que ¿hay alguna forma de cómo usar las librerías compiladas de MingW en un proyecto de MSVC? ¿O tengo que compilar/vincular todo solo en un compilador/vinculador solo MSVC/solo MingW? Se dice que el compilador MingW es compatible con MSVC.

He leído algunos hilos sobre este tema, pero en su mayoría dicen que el cambio de nombre del archivo a .lib debería hacer el trabajo, pero lamentablemente no funciona para mí.

Las bibliotecas Im tratando de enlace están escritos en C

MSVC Enlazador lanza errores como:

error LNK2019: unresolved external symbol "int __cdecl openssl_call(struct ssl_State *,int,int,int)" ([email protected]@[email protected]@[email protected]) referenced in function _main MyAPP.obj 

... y 4 más mismos errores que se refieren a otras funciones llamadas desde mi aplicación.

Gracias por cualquier consejo.

+0

¿No pudo compilar todo en MSVC? –

+0

"O bien, .a y .lib son solo archivos AR de archivos .o o .obj" ¿Está seguro de que los archivos .lib estáticos de msvc son como archivos .a "ar"? –

+0

Parece que esta pregunta (y sus respuestas) son específicas de C en lugar de C++ ... ¿puede confirmarlo? – d3vid

Respuesta

10

Sobre la base de este error se pone en un comentario:

LNK2019 de error:? Sin resolver símbolo externo "int __cdecl openssl_call (struct ssl_State *, int, int, int)" (openssl_call @@ YAHPAUssl_State @@ HHH @ Z) referencia en función de _main MyAPP.obj todos los otros 4 errores son los mismos únicamente con nombres de otras funciones

Trate de poner extern "C" ar Envía tus archivos de inclusión para openssl. Por ejemplo:

extern "C" { 
include "openssl.h" 
} 

usando extern "C" instruirá al compilador que las funciones están utilizando vinculación C, no C++, que evitar que la realización de name mangling en las funciones. Por lo tanto, buscará la función openssl_call en la biblioteca en lugar de? Openssl_call @@ YAHPAUssl_State @@ HHH @.

+4

Esto es ciertamente una solución probable, pero si es cierto, me sorprende que SSL no lo haga por sí mismo, tal vez el autor odia C++ :-) –

9

Las bibliotecas son compatibles, pero solo si proporciona una interfaz C. MSVC y g ++ utilizan diferentes esquemas de creación de nombres, por lo que no puede vincular fácilmente el código C++ creado con uno con código creado por el otro.

+1

Entonces, ¿qué debo hacer para vincular la lib compilada de MingW con el ejecutable compilado de MSVC con éxito? – NumberFour

+0

@NumberFour En primer lugar, ¿está intentando vincular el código de C++? –

+0

La aplicación a la que estoy vinculando las bibliotecas está escrita en C++, las bibliotecas que se vinculan son C (its openssl, zlib y xerces) – NumberFour

7

Codifiqué las mismas situaciones que usan mll compilado en mingw en MSVC. Yo uso las siguientes herramientas para hacer que funcione:
1) utilizar gcc como esa:

gcc -o -shared your_dll.dll your_dll_src.c -Wl, - salida de definición, your_dll.def

Las negritas especifican que gcc generará un archivo * def que guiará sus artículos exportados. Luego necesitará lib.exe, que distribuye con MSVC, ejemplo como este:

lib /def:your_dll.def

Luego, habrá un archivo your_dll.lib, proviene de lib.exe (Suponga que. you_dll.dll ubicado en el mismo directorio que your_dll.def).

Actualmente, puedo usar * .lib en mi proyecto MSVC y vincular correctamente el dll, pero obtuve el error de tiempo de ejecución. De todos modos, tales trabajos hacen que su enlace sea viable.

+0

La razón por la que el .dll debe estar en el mismo directorio que el .def es porque el .def es solo metainformación utilizada para la conversión. La pregunta que queda es: ¿la conversión con lib.exe también funciona si la biblioteca no tiene una interfaz de estilo C? El hecho de que esta respuesta mencione un error de tiempo de ejecución implica que la utilidad es bastante inútil ... – jiggunjer

Cuestiones relacionadas