2010-01-04 12 views
6

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 commence à écrire la « Bibliothèque »:Pourquoi g ++ n'est-il pas lié à la bibliothèque dynamique que je crée?

/* 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 puis compilez 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 aidez-moi :)

Répondre

11

-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

+0

Merci, la lib était absent à l'avant (.o au lieu de .so était juste une faute de frappe) :) – lazlow

3

le nom du fichier de sortie devrait être libThinFS.so, par exemple

 
g++ -shared -fPIC FileSystem.cpp -o libThinFS.so 
1

Le résultat de g++ -shared -fPIC FileSystem.cpp n'est pas un fichier objet, il ne devrait pas se terminer par .o. En outre, les bibliothèques partagées doivent être nommées libXXX.so. Renommez la bibliothèque et cela fonctionnera.

6

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 »