Problema da neofita su libreria non linkata

di
Anonimizzato6928
il
4 risposte

Problema da neofita su libreria non linkata

Ciao a tutti,
sono un programmatore Java e mi trovi mio malgrado a dover velocissimamente fare una cosa in C.
Ora vi espongo il problema che ho trovato.

Per iniziare sto lavorando con Eclipse cpp, g++ e MinGW.
Praticamente il fornitore di un lettore di carte magnetiche mi ha inviato un pacchetto con le API la libreria e i driver per utilizzare il device. QUindi il file .h, la lib e la dll.
Ho creato il progetto su Eclipse e gli ho linkato la libreria in maniera implicita. Il Linker vede la libreria ma continua a dirmi "undefined reference to `IfdClose'" ifClose è la funzione che referenzio.

L'output del compilatore è questo:
**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\TestCardReader.o ..\src\TestCardReader.cpp
..\src\TestCardReader.cpp: In function `int main()':
..\src\TestCardReader.cpp:26: warning: unsigned int format, DWORD arg (arg 3)
g++ -LC:\workspace-cpp\TestCardReader\lib -oTestCardReader.exe src\TestCardReader.o -lVenusDrv
src\TestCardReader.o: In function `main':
C:/workspace-cpp/TestCardReader/Debug/../src/TestCardReader.cpp:21: undefined reference to `IfdOpen'
C:/workspace-cpp/TestCardReader/Debug/../src/TestCardReader.cpp:31: undefined reference to `IfdClose'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 907  ms.  
Non venendone a capo ho provato a referenziare dinamicamente la dll... la trova ma poi comunque non riesce a chiamare il metodo.. il codice con cui ho effettuato la prova è questo:
	 HINSTANCE lpsolve;
	 typedef HANDLE (*FNVENUSOPEN)(char*);

	 FNVENUSOPEN MyFunc1;

	 LPCSTR string;
	 string = "IfdOpen";
	 lpsolve = LoadLibrary("VenusDrv.dll");
	 if (lpsolve == NULL) {
	     printf("Unable to load lpsolve shared library\n");
	     return(FALSE);
	   }

	 printf(string);
		 MyFunc1 = (FNVENUSOPEN) GetProcAddress(lpsolve, string);

	 DWORD dwfunct = GetLastError();
	 if (!MyFunc1)
	    {
	       // handle the error
	       FreeLibrary(lpsolve);
	       printf("Unable to find function DLL\n"+dwfunct);
	       return 0;


	    } else {

	    	hIfd = MyFunc1("COM1");
	    		if (hIfd == NULL)
	    		{
	    		char szBuf[200];
	    		DWORD dw = GetLastError();
	    		sprintf(szBuf, "IfdOpen failed: GetLastError returned %u\n", dw);
	    		MessageBox(NULL, szBuf, "ERROR", MB_OK | MB_ICONSTOP);
	    		ExitProcess(dw);
	    		}
	    }
	return 0;
Nemmeno questo va..
viene stampato: printf("Unable to find function DLL\n"+dwfunct);
con errore string::compare...

Sono disperato.. qualcuno mi da qualche dritta?

4 Risposte

  • Re: Problema da neofita su libreria non linkata

    TestCardReader.cpp include il file header di libreria?

    Saluti,
    Max
  • Re: Problema da neofita su libreria non linkata

    Oltre a quello puoi provare a registrare la dll aprendo il cmd e digitando Regsvr32 nome.dll

  • Re: Problema da neofita su libreria non linkata

    Vi ringrazio delle risposte..
    Allora ho optato per il link dinamico, ho decompilato un programma che usava la dll e mi sono preso il nome dei metodi che esponeva la dll, erano leggermente diversi da quelli descritti nelle API.. _IdfOpen@4 (non capisco come mai ma usando questo sono riuscito a accedere al device).

    Sto andando lentamente avanti ma la cosa che non mi riesco a spiegare è il link diretto alla libreria. Cavolo l'ho referenziata bene.. leggevo in giro che la dll deve essere inclusa nel progetto.. ma devo linkare anche quella?
  • Re: Problema da neofita su libreria non linkata

    .. ma devo linkare anche quella
    Certo che si. Devi passare anche l'eventuale percorso nel Makefile. Esempio:
    g++ source -L/path/to/mylib -lmylib -o mybin
Devi accedere o registrarti per scrivere nel forum
4 risposte