2010-10-25 11 views
8

Sto cercando di capire come utilizzare le librerie non standard nei miei progetti C++. Ho qualche domanda.Collegamento C++ alle librerie con makefile (newbe)

Diciamo che voglio usare la libreria POCO. Quindi l'ho scaricato e creato usando make (build statica). Ora ho un sacco di file .o e file .h. C'è un file Path.h e un file Path.o in diverse directory.

Ora voglio utilizzare questo modulo nel mio codice. Quindi includo il file usando #include "Poco/Path.h". Devo modificare makefile e aggiungere Path.o al mio target?

Cosa succede quando uso la libreria standard? Sono quelli disponibili solo nei file di intestazione? So che il codice del modello non può essere precompilato. E il resto?

risposta

10

Oltre ai file .h e .o, probabilmente si avranno anche uno o più file e/o libXXX.so. Questi sono i file di libreria reali a cui deve essere collegato l'applicazione.

Per utilizzare la libreria, includere le intestazioni pertinenti nel file sorgente e modificare il makefile per comunicare al linker che deve collegare l'applicazione alla libreria XXX. Il tipico comando linker per questo è -lXXX e il linker cercherà sia libXXX.a che libXXX.so e utilizzerà quello che sembra più appropriato.

La libreria standard non è molto diversa dalle librerie esterne, ad eccezione del fatto che non è necessario specificarlo esplicitamente al linker.

+0

Quindi. Un file è una libreria statica e .so è dinamico/condiviso? – Seba

+0

@Seba: Sì, è corretto. –

+0

Grazie mille :) – Seba

8

La tua domanda sembra implicare che tu abbia già un makefile per il tuo codice. Se questo è il caso, allora sì, dovresti modificare la regola per il tuo eseguibile in quel makefile. Come sottolinea Bart van Ingen Schenau, il makefile POCO probabilmente assemblava i file degli oggetti in librerie come Poco/Libraries/libPoco.a, quindi dovresti usarli invece di cercare di individuare i file oggetto di cui hai bisogno. Per esempio, se in questo momento la regola recita:

foo: foo.o bar.o 
    g++ -lSomeLibrary $^ -o [email protected] 

si dovrebbe cambiare per

foo: foo.o bar.o 
    g++ -lSomeLibrary -LPoco/Libraries -lPoco $^ -o [email protected] 

(La seconda parte della tua domanda, è "Che cosa succede ... E il resto?" non chiaro a me.)

Nota: È una cattiva idea per #include "Poco/Path.h". Questo rende il tuo codice dipendente da una struttura di directory, qualcosa a cui non dovrebbe interessare. È molto meglio a #include "Path.h" e dire al compilatore dove trovarlo: g++ -c -IPoco ....