2011-08-15 13 views
5

tengo un hardware (sensor de rayos x) que tiene herramientas de desarrollo. pero afaiu estos están construidos en msvc. entonces tengo un archivo .lib y un archivo .dll. si incluyo este archivo lib en mi proyecto (estoy usando qt), y pongo el archivo dll en la carpeta exe y compilo usando la opción MSVC-Release todo funciona. Pero cuando intento compilar usando la opción mingw-Release. falla.usando msvc lib en mingw

referencia indefinida a `imp __ZN6IDcDrv6CreateEPKci '

referencia indefinida a` imp __ZN6IDcDrv14GetDeviceCountEv'

puede señalar alguna manera para que pueda utilizar estos lib. y archivos DLL usando el compilador MinGW

ps: i intentado y no impdef dclibsn.dll> dclib.def

dlltool -dllname dclibsn.dll --def dclib.def --output-lib libdclibsn.a

y así es como mi archivo de definición parece

LIBRARY "dclibsn.dll" 
EXPORTS 
[email protected]@[email protected]@@Z 
[email protected]@[email protected][email protected][email protected][email protected]@[email protected]@@@@[email protected]@@Z 
[email protected]@[email protected]@@Z 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected]@@Z 
[email protected]@[email protected]@@Z 
[email protected]@@[email protected] 
[email protected]@@AAE_NXZ 
[email protected]@@[email protected] 
[email protected]@@[email protected] 
[email protected]@@[email protected]@[email protected] 

nota de la última entrada en este archivo (Crear). estoy tratando de llamar a este en el programa y me sale

(.text+0x1ad): undefined reference to `_imp___ZN6IDcDrv6CreateEPKci' 

y si se sustituye la línea? Crear IDcDrv @ @@ @@ SAPAVDcDrv PBDH @ Z

con imp __ZN6IDcDrv6CreateEPKci compila, pero da error.

The procedure entry point _ZN6IDcDrv6CreateEPKci could not be located in the dynamic link library dclibsn.DLL. 

Respuesta

0

soy ciertamente ningún experto en el tema, pero siempre pensé que un proyecto construido con MinGW no era capaz de utilizar cualquier DLL o bibliotecas de un proyecto msvc, ya que están construidos con diferentes compiladores.

+0

eso es cierto. así que estoy tratando de encontrar una forma de exportar este dll y lib a un formato para que pueda vincularlo con mingw. y si soy correcto, el archivo dll se puede usar para los archivos .lib y .a. – ardavar

+0

Muy bueno. Estaré pendiente de esto para ver si encuentras una solución, porque tengo curiosidad por hacer esto por un tiempo. – NeilMonday

1

ver esto: How to use libraries compiled with MingW in MSVC?

quiero decir que rodea # include con extern bloque "C". Porque el uso de la opción "C" le indicará al compilador que las funciones están usando el enlace C, no C++, lo que evitará que se modifique el nombre de las funciones.

Creo que la manipulación de nombres causa problemas en el enlace. No sé si esto ayudará el uso automático de dll o no. Espero que así sea Porque necesito escribir un dll basado en CUDA en MSVC 2005 y usarlo en mingw.

Espero que te ayudemos. : -?

0

Tiene un problema simple aquí: El esquema de creación de nombres, es decir, la asignación de funciones C++ con nombres posiblemente sobrecargados a cadenas que identifican funciones solo por nombre, para el compilador MS y para GCC es diferente. Por lo tanto, los nombres de las funciones son diferentes, y el MingW busca su propio formato de nombre (_ZN6IDcDrv6CreateEPKci) y no puede encontrar el nombre microsoftly destrozado ( [email protected]@@[email protected]@[email protected]).

Ahora, si estas dos bibliotecas realmente usan características C++, esto es mucho mejor.Supongamos que pasa una cadena de C++ de la biblioteca a su programa y viceversa; no hay absolutamente ninguna garantía de que la implementación de MS de la cadena sea compatible con binarios para la implementación de GNU, por lo que probablemente termine con errores desagradables.

Sin embargo, si la interfaz de estas funciones es compatible con C (se puede expresar en términos de POD), puede declarar las funciones dentro de un bloque extern "C" y así desactivar el cambio de nombre. Parece que los desarrolladores de la lib contra la que estás construyendo no hicieron esto. Si esto fue innecesario (lo siento, no puedo exigir nombres MSVC a una firma de función, así que realmente no puedo decir), debe presentar un error en la biblioteca y hacer que declare la interfaz o partes tan grandes como sea posible con extern "C". Si eso es imposible, escriba un contenedor en MSVC que llame a sus funciones y declare sus propias funciones dentro de un extern "C".

0

Según lo observado por @thithon, su problema es el cambio de nombre de C. Como sugiere, debe hacer lo externo "C" para evitar eso.

El error de punto de entrada se debe a que probablemente no tenga un main() en su dll. Simplemente agregue uno (incluso si está vacío, no importa), y ese error desaparecerá.