Newsgroup: it.comp.lang.c++
Titolo: includere librerie non standard

Buongiorno a tutti,
avrei bisogno di alcune informazioni riguardante l'utilizzo di librerie 
esterne non standard all'interno di un progetto Win32 utilizzando 
l'ambiente di programmazione MS Visual C++ 2005 Express Edition.
Attualmente ho una libreria chiamata MBT.h che ho incluso nel progetto, 
precisamente nella cartella "Header Files" e risiede fisicamente nella 
cartella di progetto. Il file del codice sorgente si chiama 
ExternalControl.cpp e include la libreria.
--- File ExternalControl.cpp ---
#include "MBT.h"
...
LONG ret;
...
ret = MBTInit();
...
--- File MBT.h ---
...
LONG WINAPI MBTInit();
...
In fase di compilazione ho il seguente risultato:
------ Inizio generazione: Progetto: ExternalControl, Configurazione: 
Debug Win32 ------
Collegamento in corso...
ExternalControl.obj : error LNK2019: riferimento al simbolo esterno 
_MBTInit@0 non risolto nella funzione _main
E:\Documenti\Visual Studio 
2005\Projects\ExternalControl\Debug\ExternalControl.exe : fatal error 
LNK1120: 1 esterni non risolti
Il log di generazione ï¿œ stato salvato in 'file://e:\Documenti\Visual 
Studio 2005\Projects\ExternalControl\ExternalControl\Debug\BuildLog.htm'
ExternalControl - 2 errore/i, 0 avviso/i
========== Generazione: 0 completate, 1 non riuscite, 0 aggiornate, 0 
ignorate ==========
Questo errore si verifica quando inserisco il codice "ret = MBTInit();".
Mi sapete dire come mai non riesce il compilatore a lincare la libreria?
Cosa avviene praticamente durante la compilazione?
Grazie anticipatamente

Tony ha scritto:

Allora qua si discute di C++ standard non ambienti di sviluppo e/o
librerie extra, detto questo il file MBT.h non ï¿œ una libreria ma un file
di dichiarazioni, le librerie sono un insieme di codice compilato e si
dividono in statiche e dinamiche, le statiche vengono interamente
inserite nell'eseguibile, le dinamiche vengono collegate a runtime,
quindi per compilare correttamente devi indicare al linker il percorso e
il nome della libreria.
Ti faccio un esempio su linux che sono pratico, su windows non so che
dirti ma almeno ti fai un idea,
supponendo che hai due file C++: mio_file.cc e mio_file_main.cc e una
libreria mia_lib nella sotto directory lib e relativi file di incluse
nella sotto directory include:
g++ -c -Wall -L./lib -I./include mio_file.cc -o mio_file.o
g++ -c -Wall -L./lib -I./include mio_file:main.cc -o mio_file_main.o
in questo modo hai i due codici oggetto adesso tocca al linker:
g++ -L./lib -lmia_lib mio_file.o mio_file_main.o -o mio_eseguibile
quindi da qualche parte nelle opzioni di progetto dovresti avere
qualcosa del tipo:
percorso librerie aggiuntive
percorso include aggiuntivi
librerie aggiuntive
nei quali dovresti mettere rispettivamente la directory della libreria
la directory del file di include (ma nel tuo caso ï¿œ tutto nella stessa
directory quindi questi passaggi credo siano opzionali su windows)
e infine quale libreria il linker deva collegare all'eseguibile.
ï¿œ una spiegazione da bar per una piï¿œ approfondita vedi la sezione
librerie esterne sul manuale del tuo compilatore.

Tony ha scritto:

Puo darsi che la funzione MBTInit abbia un legame di tipo C
oppure non  hai incluso il .lib nei parametri del linker