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 ++.
c++
gcc
compiler-construction
g++
linuxx
źródło
źródło
Odpowiedzi:
Utwórz plik .o:
dodaj ten plik do biblioteki, tworząc w razie potrzeby bibliotekę:
użyj biblioteki:
źródło
a.out
formacie, więc jest to wysoce mylące. I dlaczego „nigdy” nie miałbyś tworzyć pliku wykonywalnego o nazwietest
?test
jest to polecenie systemowe. Ale ponieważ programy testowe zwykle nigdy nie są instalowane w systemowym katalogu bin i wymagają pisania,./test
nie stanowi to dla mnie większego problemu ...a.out
formacie, 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.test
Jest w porządku dla nazwy pliku wykonywalnego, o ile piszesz tylko szybki test fragment oczywiście.)test
jest 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”.Możesz utworzyć
.a
plik za pomocąar
narzędzia, na przykład:lib
to 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 tworzylibHeader.a
w katalogulib
. Tak więc w bieżącym katalogu wykonaj:Następnie uruchom powyższe
ar
polecenie.Łącząc wszystkie biblioteki, możesz to zrobić w następujący sposób:
-L
Flag dostanieg++
dodaćlib/
katalog do ścieżki. W ten sposóbg++
wie, jaki katalog przeszukać podczas wyszukiwanialibHeader
.-llibHeader
oznacza konkretną bibliotekę do połączenia.gdzie test.o jest tworzony w ten sposób:
źródło
-lHeader
zamiast-llibHeader
?Tak.
Utwórz plik .o (jak zwykle):
Utwórz archiwum :
Test :
Zauważ, że tworzenie archiwum zawierającego tylko jeden moduł wydaje się trochę bezcelowe. Równie łatwo mógłbyś napisać:
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!
źródło
ranlib
co w GNU po prostu oznaczaar s
.