Zbuduj plik .so z pliku .c, używając wiersza poleceń gcc

162

Próbuję stworzyć projekt Hello World dla bibliotek dynamicznych Linuksa (pliki .so). Więc mam plik hello.c:

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

Jak utworzyć plik .so, który eksportuje hello(), używając gcc z wiersza poleceń?

sashoalm
źródło

Odpowiedzi:

292

Aby wygenerować bibliotekę współdzieloną, musisz najpierw skompilować swój kod C z -fPICflagą (kod niezależny od pozycji).

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

Spowoduje to wygenerowanie pliku obiektowego (.o), teraz bierzesz go i tworzysz plik .so:

gcc hello.o -shared -o libhello.so

EDYCJA : Sugestie z komentarzy:

Możesz użyć

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

zrobić to w jednym kroku. - Jonathan Leffler

Proponuję również dodać, -Wallaby uzyskać wszystkie ostrzeżenia i -guzyskać informacje o debugowaniu, do gccpoleceń. - Basile Starynkevitch

dreamcrash
źródło
1
Najpierw musisz wykonać gcc -c -fPIC blabla.c -o blabla.o, a następnie powyższe polecenie.
dreamcrash
57
Lub gcc -shared -o libhello.so -fPIC hello.czrobić to w jednym kroku.
Jonathan Leffler,
5
Proponuję również dodać, -Wallaby uzyskać wszystkie ostrzeżenia i -guzyskać informacje o debugowaniu, do gccpoleceń.
Basile Starynkevitch
Dzięki za rekomendacje, dodałem je do odpowiedzi
dreamcrash
3
.oPlik @sashoalm jest w zasadzie plikiem obiektowym dla pliku źródłowego, przed połączeniem ich razem w ostateczny plik wykonywalny. Więc po uruchomieniu gcc -o abc.c abc.ozostanie wygenerowany plik obiektowy. W takim razie możesz użyć tego abc.opliku do utworzenia .sopliku. Do stworzenia tak wielu plików potrzebujesz tylko poprawnego kodu c zapisanego w .cpliku. PS: Tylko za wyjaśnienie wątpliwości w komentarzu.