¿Por qué no se vincula g ++ con la biblioteca dinámica puedo crear?
-
18-09-2019 - |
Pregunta
He estado tratando de hacer algunas aplicaciones que todos dependen de la misma biblioteca, y las bibliotecas dinámicas fueron lo primero que pensé: Así que empecé a escribir 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;
}
A continuación, compile la "biblioteca"
g++ -shared -fPIC FileSystem.cpp -o ThinFS.o
Entonces escribí rápidamente un archivo que utiliza la biblioteca:
#include "ThinFS.h"
int main() {
FileSystem::create_container("foo");
return (42);
}
luego trató de compilar que con
g++ main.cpp -L. -lThinFS
Pero no va a compilar con el siguiente error:
/usr/bin/ld: cannot find -lThinFS
collect2: ld returned 1 exit status
Creo que me falta algo muy obvio, por favor, ayúdame:)
Solución
-lfoo
busca una biblioteca llamada libfoo.a
(estática) o libfoo.so
(compartido) en la ruta actual de la biblioteca, por lo que la creación de la biblioteca, es necesario utilizar g++ -shared -fPIC FileSystem.cpp -o libThinFS.so
Otros consejos
Puede utilizar
g++ main.cpp -L. -l:ThinFS
El uso de "dos puntos" utilizará el nombre de biblioteca como es, más bien que requiere un prefijo de "lib"
el nombre del archivo de salida debe ser libThinFS.so , por ejemplo.
g++ -shared -fPIC FileSystem.cpp -o libThinFS.so
El resultado de g++ -shared -fPIC FileSystem.cpp
no es un archivo objeto, por lo que no debe terminar con .o
. Además, las bibliotecas compartidas se deben nombrar libXXX.so
. Cambiar el nombre de la biblioteca y que va a funcionar.
Consulte este artículo.
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
Un buen recurso sobre cómo construir diferentes tipos de bibliotecas. También describe cómo y dónde utilizarlos.