Perché g++ non si collega alla libreria dinamica che creo?
-
18-09-2019 - |
Domanda
Ho provato a creare alcune applicazioni che si basano tutte sulla stessa libreria e il mio primo pensiero è stato quello delle librerie dinamiche:Così ho iniziato a scrivere la "Biblioteca":
/* ThinFS.h */
class FileSystem {
public:
static void create_container(string file_name); //Creates a new container
};
/* ThinFS.cpp */
#include "ThinFS.h"
void FileSystem::create_container(string file_name) {
cout<<"Seems like I am going to create a new file called "<<file_name.c_str()<<endl;
}
Quindi compilo la "Libreria"
g++ -shared -fPIC FileSystem.cpp -o ThinFS.o
Ho quindi scritto rapidamente un file che utilizza la Libreria:
#include "ThinFS.h"
int main() {
FileSystem::create_container("foo");
return (42);
}
Ho quindi provato a compilarlo con
g++ main.cpp -L. -lThinFS
Ma non verrà compilato con il seguente errore:
/usr/bin/ld: cannot find -lThinFS
collect2: ld returned 1 exit status
Penso che mi manchi qualcosa di molto ovvio, per favore aiutami :)
Soluzione
-lfoo
cerca una libreria chiamata libfoo.a
(statico) o libfoo.so
(condiviso) nel percorso della libreria corrente, quindi per creare la libreria è necessario utilizzare g++ -shared -fPIC FileSystem.cpp -o libThinFS.so
Altri suggerimenti
Puoi usare
g++ main.cpp -L. -l:ThinFS
L'uso di "due punti" utilizzerà il nome della libreria così com'è, anziché richiedere il prefisso "lib"
il nome del file di output dovrebbe essere libThinFS.so, per esempio.
g++ -shared -fPIC FileSystem.cpp -o libThinFS.COSÌ
Il risultato di g++ -shared -fPIC FileSystem.cpp
non è un file oggetto, quindi non dovrebbe terminare con .o
.Inoltre, le librerie condivise dovrebbero essere nominate libXXX.so
.Rinominare la libreria e funzionerà.
Dai un'occhiata a questo articolo.
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
Una buona risorsa su come costruire diversi tipi di librerie.Descrive anche come e dove usarli.