2017-03-23 1 views
0

J'utilise GNU g++ 4.9.2 compiler à la fois sur Solaris et Linux. Sur la plateforme Solaris, pour créer une bibliothèque partagée à partir d'un fichier source (AC), j'utilise la commande suivante:Option GNU g ++ -G pour créer une bibliothèque partagée disponible sous Solaris sous Linux

g++ -G a.c -o a 

a devient une bibliothèque partagée a.c contient le code suivant:

void libfn1() 
{ 
} 

Si j'essaie de ne pas utiliser l'option -G-à-dire la compilation comme:

g++ a.c -o a 

Il obtient une erreur de liaison: Undefined Symbol main

Mais, sous Linux, si je fais la même chose: il est dit:

g++: error: unrecognized command line option -G 

Comment créer une bibliothèque partagée sur Linux? Quelle est l'option g++ pour cela?

+1

Avez-vous essayé * * la recherche pour savoir comment créer des bibliothèques partagées sur Linux? Il y a beaucoup d'exemples et de tutoriels sur Internet. –

+2

- partagé devrait fonctionner. Vous pouvez également vouloir les options -fPIC et --soname. – cleblanc

Répondre

1

g ++ documentation dit ceci:

These additional options are available on System V Release 4 for compatibility with other compilers on those systems:

-G Create a shared object. It is recommended that -symbolic or -shared be used instead.

Normalement, vous voulez générer du code indépendant poste aussi, pour une bibliothèque partagée, avec le drapeau -fPIC.

Vous voudriez exécuter:

g++ -fPIC -shared a.c -o liba.so 
1

Le processus de création d'une bibliothèque partagée sur un système Linux est un peu différent.

Les bibliothèques partagées sur Linux sont .so (pour les "objets partagés") et non .g.

vous le faites comme ceci:

Tout d'abord, vous devez générer position-independent code de votre source C++. C'est ainsi que votre bibliothèque fonctionne de partout où elle est appelée. Pour ce faire, vous devez utiliser l'indicateur -fPIC de g ++. Par conséquent, pour chaque fichier source que vous souhaitez inclure dans votre bibliothèque, vous devez le compiler uniquement en code indépendant de la position. Nous allons gérer la liaison plus tard.

Pour chaque fichier source:

g++ -c -fPIC file.cpp

(Le drapeau indique -c g ++ "compiler, ne liez pas").

pour chaque file.cpp, g ++ générera file.o, un fichier objet contenant un code indépendant de la position.

Pour ensuite construire les fichiers d'objets dans une bibliothèque partagée, vous devez utiliser

g++ -o -shared myLibrary.so {all_object_files}

Donc, si vous avez file1.o, file2.o et file3.o, la commande serait:

g++ -shared -o myLibrary.so file1.o file2.o file3.o

Bien sûr, si vous avez beaucoup de fichiers, cela peut devenir fastidieux, alors vous devriez écrire un Makefile pour automatiser ce processus pour toi! Voici un exemple:

myLibrary.so: file1.o file2.o file3.o 
     $(CXX) -shared $^ -o [email protected] 

file1.o file2.o file3.o : CXXFLAGS+=-fPIC 
+0

Can -fPIC peut-il être utilisé comme indicateur de compilation pour les objets non partagés, je veux dire pour les exécutables? –

+0

@ Dr.DebasishJana Le drapeau pour les exécutables est -fPIE, pour "Exécutable indépendant de la position". -fPIC est pour les bibliothèques. –