Erstellen Sie eine .so-Datei aus einer .c-Datei mit der Befehlszeile gcc


162

Ich versuche ein Hallo-Welt-Projekt für dynamische Linux-Bibliotheken (.so-Dateien) zu erstellen. Also habe ich eine Datei hello.c:

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

Wie erstelle ich eine .so-Datei hello(), die mit gcc über die Befehlszeile exportiert wird?

Antworten:


290

Um eine gemeinsam genutzte Bibliothek zu generieren, müssen Sie zuerst Ihren C-Code mit dem -fPICFlag (positionsunabhängiger Code) kompilieren .

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

Dadurch wird eine Objektdatei (.o) generiert. Jetzt nehmen Sie sie und erstellen die .so-Datei:

gcc hello.o -shared -o libhello.so

EDIT : Vorschläge aus den Kommentaren:

Sie können verwenden

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

in einem Schritt zu tun. - - Jonathan Leffler

Ich schlage außerdem vor , Ihre Befehle zu ergänzen -Wall, um alle Warnungen und -gDebugging-Informationen zu erhalten gcc. - Basiler Starynkevitch


1
Sie müssen zuerst gcc -c -fPIC blabla.c -o blabla.o und dann den obigen Befehl ausführen.
Dreamcrash

57
Oder gcc -shared -o libhello.so -fPIC hello.cum es in einem Schritt zu tun.
Jonathan Leffler

5
Ich schlage außerdem vor , Ihre Befehle zu ergänzen -Wall, um alle Warnungen und -gDebugging-Informationen zu erhalten gcc.
Basile Starynkevitch

Vielen Dank für die Empfehlungen, ich habe sie der Antwort hinzugefügt
Dreamcrash

3
@sashoalm- .oDatei ist im Grunde eine Objektdatei für die Quelldatei, bevor sie miteinander in die endgültige ausführbare Datei verknüpft werden. Wenn Sie also gcc -o abc.c abc.oeine Objektdatei ausführen, wird diese generiert. Ans dann können Sie diese abc.oDatei verwenden, um eine .soDatei zu erstellen . Um so viele Dateien zu erstellen, benötigen Sie lediglich einen korrekten c-Code, der in eine .cDatei geschrieben ist. PS: Nur um Ihre Zweifel im Kommentar auszuräumen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.