Pourquoi ne pas g ++ lien avec la bibliothèque dynamique que je crée?
-
18-09-2019 - |
Question
J'ai essayé de faire des applications qui seraient toutes sur la même bibliothèque, et les bibliothèques dynamiques ont été ma première pensée: Je commencé à écrire la « Bibliothèque »:
/* 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;
}
Je compile alors la "Bibliothèque"
g++ -shared -fPIC FileSystem.cpp -o ThinFS.o
Je puis rapidement écrit un fichier qui utilise la bibliothèque:
#include "ThinFS.h"
int main() {
FileSystem::create_container("foo");
return (42);
}
J'ai ensuite essayé de compiler cela avec
g++ main.cpp -L. -lThinFS
Mais il ne sera pas compilé avec l'erreur suivante:
/usr/bin/ld: cannot find -lThinFS
collect2: ld returned 1 exit status
Je pense que je manque quelque chose très évident, s'il vous plaît me aider:)
La solution
-lfoo
recherche une bibliothèque appelée libfoo.a
(statique) ou libfoo.so
(partagé) dans le chemin de la bibliothèque actuelle, afin de créer la bibliothèque, vous devez utiliser g++ -shared -fPIC FileSystem.cpp -o libThinFS.so
Autres conseils
Vous pouvez utiliser
g++ main.cpp -L. -l:ThinFS
L'utilisation de « colon » utilisera le nom de la bibliothèque comme il est plutôt exigeant un préfixe « lib »
le nom du fichier de sortie doit être libThinFS.so , par exemple.
g++ -shared -fPIC FileSystem.cpp -o libThinFS.so
Le résultat de g++ -shared -fPIC FileSystem.cpp
n'est pas un fichier objet, il ne doit pas se terminer par .o
. En outre, les bibliothèques partagées doivent être nommés libXXX.so
. Renommer la bibliothèque et il fonctionnera.
Consultez cet article.
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
Une bonne ressource sur la façon de construire différents types de bibliothèques. Il décrit également comment et où les utiliser.