SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: andreina en Jueves 20 de Octubre de 2005, 18:09

Título: Link En Visual C++ 6.0
Publicado por: andreina en Jueves 20 de Octubre de 2005, 18:09
Hola
Necesito acceder a funciones que estan escritas en un dll y un .lib, para poder usarlas debo incluir el archivo .h y el .lib
Para ello en la ventana de settings del proyecto y en la pestaña de link, categoria general y en object\module incluyo el .lib que necesito.
Adicionalmente en options hago el include del .h que necesito. Pero obtengo el siguiente error:
Error LNK2001 unresolved external simbol "int_stdcall LS100_Open" donde LS100_Open es la funcion del .lib que necesito
Error LNK1120 unresolved simbol
Apreciaria mucho si me ayudasen con este problema
Saludos
Título: Re: Link En Visual C++ 6.0
Publicado por: Eternal Idol en Jueves 20 de Octubre de 2005, 19:06
En teoria ya deberia funcionar, podes usar el DUMPBIN para ver los simbolos que declarados en el .LIB y pegarlos en este mensaje. Sino tambien podes pasarnos el LIB, la DLL y el .H para poder comprobar que pasa.

DUMPBIN /SYMBOLS ARCHIVO.LIB  :devil:
Título: Re: Link En Visual C++ 6.0
Publicado por: andreina en Jueves 20 de Octubre de 2005, 20:07
Hola muchas gracias por responder
Aqui te envio el .dll, el .lib y el .h.
Gracias de antemano
Título: Re: Link En Visual C++ 6.0
Publicado por: Eternal Idol en Jueves 20 de Octubre de 2005, 20:36
De nadas y ya se cual es el problema, el enlazador (linker: link.exe) esta tratando de enlazar una funcion de C++ y la funcion de la DLL esta exportada como C.

Te lo voy a mostrar con un caso practico, creando el archivo Prueba.cpp con este codigo:
Código: Text
  1.  
  2. #include <windows.h>
  3. #include "LS100.H"
  4.  
  5. void main()
  6. {
  7.   LS100_Open((HWND)0, (HANDLE)0, 0);
  8. }
  9.  
  10.  

Si le das a CL Prueba.cpp LS100.LIB obtendras el mismo error que con el proyecto que tenes, mientras que si renombras Prueba.cpp a Prueba.c y haces CL Prueba.c LS100.lib enlazara perfectamente.

¿Soluciones? Lo primero que se me viene a la mente es poner un define que cambie el extern por extern "C" de esta manera las funciones estaran declaradas como exportacion de C y no de C++.

Con esta linea en el Ls100.h ya estaria solucionado:
#define extern extern "C"

 :devil:  :devil:  :devil:
Título: Re: Link En Visual C++ 6.0
Publicado por: andreina en Jueves 20 de Octubre de 2005, 20:52
Muchas gracias ya me funciono  :D
Título: Re: Link En Visual C++ 6.0
Publicado por: Eternal Idol en Jueves 20 de Octubre de 2005, 20:55
Cita de: "andreina"
Muchas gracias ya me funciono  :D
De nadas y menos mal que funciono jeje, lo habia probado  :devil:  :devil:
Título: Re: Link En Visual C++ 6.0
Publicado por: andreina en Viernes 21 de Octubre de 2005, 21:25
Hola
Tengo otro problema, para hacer uso de las funciones que estan incluidas en el dll debo reservar memoria, para ello uso malloc y hago el include de la libreria que corresponde, es decir, tengo:

 #include <malloc.h>
luego en el programa hago:
char  *codeline;
codeline = (char *)malloc(sizeof(char)*lengthCodeline+1);

Al hacer esto obtengo el siguiente error:
error C2537: 'CC' : illegal linkage specification
y el error me lleva a lo siguiente

#ifdef  __cplusplus
extern "C" {
#endif

Creo que esto tiene que ver con lo que me explicastes
Que puedo hacer?
Muchas gracias de Antemano
Saludos
Título: Re: Link En Visual C++ 6.0
Publicado por: Eternal Idol en Viernes 21 de Octubre de 2005, 22:25
Cita de: "andreina"
Hola
Tengo otro problema, para hacer uso de las funciones que estan incluidas en el dll debo reservar memoria, para ello uso malloc y hago el include de la libreria que corresponde, es decir, tengo:

 #include <malloc.h>
luego en el programa hago:
char  *codeline;
codeline = (char *)malloc(sizeof(char)*lengthCodeline+1);

Al hacer esto obtengo el siguiente error:
error C2537: 'CC' : illegal linkage specification
y el error me lleva a lo siguiente

#ifdef  __cplusplus
extern "C" {
#endif

Creo que esto tiene que ver con lo que me explicastes
Que puedo hacer?
Muchas gracias de Antemano
Saludos
Efectivamente el problema surge por tener el define de extern pero realmente no hace ninguna falta incluir malloc.h, tenes varias opciones, una es incluir malloc.h antes de LS100.h, otra es volver a definir extern a extern justo despues de incluir LS100.h (#define extern extern) y la mejor es no incluir malloc.h que no hace falta  :devil:  :devil: