Construisez le fichier .so à partir du fichier .c en utilisant la ligne de commande gcc


162

J'essaie de créer un projet hello world pour les bibliothèques dynamiques Linux (fichiers .so). J'ai donc un fichier hello.c:

#include <stdio.h>
void hello()
{
    printf("Hello world!\n");
}

Comment créer un fichier .so qui s'exporte à l' hello()aide de gcc depuis la ligne de commande?

Réponses:


293

Pour générer une bibliothèque partagée, vous devez d'abord compiler votre code C avec l' -fPICindicateur (code indépendant de la position).

gcc -c -fPIC hello.c -o hello.o

Cela va générer un fichier objet (.o), maintenant vous le prenez et créez le fichier .so:

gcc hello.o -shared -o libhello.so

EDIT : Suggestions des commentaires:

Vous pouvez utiliser

gcc -shared -o libhello.so -fPIC hello.c

pour le faire en une seule étape. - Jonathan Leffler

Je suggère également d'ajouter -Wallpour obtenir tous les avertissements et -gpour obtenir des informations de débogage, à vos gcccommandes. - Basile Starynkevitch


1
Vous devez d'abord exécuter gcc -c -fPIC blabla.c -o blabla.o, puis la commande ci-dessus.
dreamcrash

57
Ou gcc -shared -o libhello.so -fPIC hello.cpour le faire en une seule étape.
Jonathan Leffler

5
Je suggère également d'ajouter -Wallpour obtenir tous les avertissements et -gpour obtenir des informations de débogage, à vos gcccommandes.
Basile Starynkevitch

Merci pour les recommandations, je les ai ajoutées à la réponse
dreamcrash

3
Le .ofichier @sashoalm est essentiellement un fichier objet pour le fichier source, avant de les lier ensemble, dans l'exécutable final. Ainsi, lorsque vous exécutez gcc -o abc.c abc.oun fichier objet serait généré. Ans, vous pouvez utiliser ce abc.ofichier pour créer un .sofichier. Pour créer autant de fichiers, tout ce dont vous avez besoin est un code C correct écrit dans un .cfichier. PS: Juste pour dissiper votre doute dans le commentaire.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.