Jak stworzyć bibliotekę statyczną za pomocą g ++?

101

Czy ktoś może mi powiedzieć, jak utworzyć bibliotekę statyczną z pliku .cpp i .hpp? Czy muszę tworzyć pliki .o i .a? Chciałbym również wiedzieć, jak skompilować bibliotekę statyczną i użyć jej w innym kodzie .cpp. Mam header.cpp, header.hpp .chciałbym stworzyć header.a. Przetestuj nagłówek test.cpp. A in . Do kompilacji używam g ++.

linuxx
źródło
3
Czy możesz zaakceptować odpowiedź @ NeilButterworth (lub inną)?
einpoklum

Odpowiedzi:

110

Utwórz plik .o:

g++ -c header.cpp

dodaj ten plik do biblioteki, tworząc w razie potrzeby bibliotekę:

ar rvs header.a header.o

użyj biblioteki:

g++ main.cpp header.a

źródło
3
g ++ test.cpp header.a -o test, no?
linuxx
11
@unapersson: Dlaczego? Plik wykonywalny nie jest w a.outformacie, więc jest to wysoce mylące. I dlaczego „nigdy” nie miałbyś tworzyć pliku wykonywalnego o nazwie test?
Wyścigi lekkości na orbicie
5
@Tomalak Geret'kal: Myślę, że ma to związek z faktem, że testjest to polecenie systemowe. Ale ponieważ programy testowe zwykle nigdy nie są instalowane w systemowym katalogu bin i wymagają pisania, ./testnie stanowi to dla mnie większego problemu ...
ereOn
10
@unapersson: Nie. Mówię dokładnie to, co powiedziałem. Pliki wykonywalne nie są już tworzone w a.outformacie, ale nazwa pozostaje ze względu na starsze wersje. (A jeśli nie jesteś w stanie poprawnie używać powłoki, to jest twój problem; ja na przykład wiem, jak uruchomić plik wykonywalny z bieżącego katalogu. testJest w porządku dla nazwy pliku wykonywalnego, o ile piszesz tylko szybki test fragment oczywiście.)
Wyścigi lekkości na orbicie
4
Nazywanie pliku wykonywalnego testjest czymś, czego nauczyłem się w trudny sposób, aby tego żałować i jestem „w pełni zdolny do używania powłoki”. To zły pomysł i widziałem, jak gryzie wielu innych, którzy „doskonale potrafią używać muszli”.
Prezydent James K. Polk,
46

Możesz utworzyć .aplik za pomocą arnarzędzia, na przykład:

ar crf lib/libHeader.a header.o

libto katalog zawierający wszystkie twoje biblioteki. dobrą praktyką jest organizowanie kodu w ten sposób i oddzielanie kodu od plików obiektowych. Posiadanie wszystkiego w jednym katalogu generalnie wygląda brzydko. Powyższa linia tworzy libHeader.aw katalogu lib. Tak więc w bieżącym katalogu wykonaj:

mkdir lib

Następnie uruchom powyższe arpolecenie.

Łącząc wszystkie biblioteki, możesz to zrobić w następujący sposób:

g++ test.o -L./lib -lHeader -o test  

-LFlag dostanie g++dodać lib/katalog do ścieżki. W ten sposób g++wie, jaki katalog przeszukać podczas wyszukiwania libHeader. -llibHeaderoznacza konkretną bibliotekę do połączenia.

gdzie test.o jest tworzony w ten sposób:

g++ -c test.cpp -o test.o 
Sriram
źródło
2
a co z lib / libHeader.a? ar rcs ... czy to nie lepsze niż ar crf?
linuxx
1
@linuxx: main.o będzie plikiem obiektu utworzonym z main.cc
Sriram,
@linuxx: dokładne flagi, których używasz w narzędziu ar, zależą od twoich wymagań. Przeszukanie stron podręcznika dla ar byłoby dobrym pomysłem.
Sriram
jak przetestować bibliotekę za pomocą test.cpp?
linuxx
19
Czy nie byłoby -lHeaderzamiast -llibHeader?
Dolanor
30

Czy ktoś może mi powiedzieć, jak utworzyć bibliotekę statyczną z pliku .cpp i .hpp? Czy muszę tworzyć pliki .o i .a?

Tak.

Utwórz plik .o (jak zwykle):

g++ -c header.cpp

Utwórz archiwum :

ar rvs header.a header.o

Test :

g++ test.cpp header.a -o executable_name

Zauważ, że tworzenie archiwum zawierającego tylko jeden moduł wydaje się trochę bezcelowe. Równie łatwo mógłbyś napisać:

g++ test.cpp header.cpp -o executable_name

Mimo to dam ci korzyść w postaci wątpliwości, że twój rzeczywisty przypadek użycia jest nieco bardziej złożony, z większą liczbą modułów.

Mam nadzieję że to pomoże!

Wyścigi lekkości na orbicie
źródło
1
Jak dołączamy wiele modułów?
Sidhin S Thomas
2
Dobry! Czasami widzimy, ranlibco w GNU po prostu oznacza ar s.
Viet