Mam mały fragment kodu, który zależy od wielu bibliotek statycznych (a_1-a_n). Chciałbym spakować ten kod do biblioteki statycznej i udostępnić go innym osobom.
Moja biblioteka statyczna, nazwijmy ją X, kompiluje się dobrze.
Stworzyłem prosty przykładowy program, który używa funkcji z X, ale kiedy próbuję połączyć go z X, otrzymuję wiele błędów dotyczących brakujących symboli z bibliotek a_1 - a_n.
Czy jest sposób, żebym mógł stworzyć nową bibliotekę statyczną, Y zawierającą X i całą funkcjonalność potrzebną X'owi (wybrane bity z a_1 - a_n), abym mógł rozprowadzać tylko Y, aby ludzie mogli łączyć swoje programy?
AKTUALIZACJA:
Przyjrzałem się po prostu zrzuceniu wszystkiego za pomocą ar i zrobieniu jednej mega-lib, która kończy się tym, że zawiera wiele symboli, które nie są potrzebne (wszystkie pliki .o mają około 700 MB, jednak statycznie linkowany plik wykonywalny ma 7 MB). Czy istnieje dobry sposób na uwzględnienie tylko tego, co jest rzeczywiście potrzebne?
Wygląda to ściśle związane z Jak połączyć kilka bibliotek C / C ++ w jedną? .
-r
dzięki której dane wyjściowe mogą być użyte jako dane wejściowe dla ld. Jeśli połączysz się raz, powinieneś otrzymać relokowany plik, który może być zastępcą twoich bibliotek. (próbowałem tego thogh).Jeśli używasz programu Visual Studio, to tak, możesz to zrobić.
Narzędzie do tworzenia bibliotek, które jest dostarczane z programem Visual Studio, umożliwia łączenie bibliotek razem w wierszu polecenia. Nie znam jednak żadnego sposobu, aby to zrobić w edytorze wizualnym.
źródło
W systemie Linux lub MingW z zestawem narzędzi GNU:
Jeśli nie usuniesz
liba.a
ilibb.a
, możesz utworzyć „cienkie archiwum”:W systemie Windows z łańcuchem narzędzi MSVC:
źródło
ar crsT
, który robi coś w rodzaju „dowiązania symbolicznego” zamiast kopiowania, wtedy wystarczy wysłać tylko jedną kopię danych.Biblioteka statyczna to po prostu archiwum
.o
plików obiektowych. Wypakuj jear
(zakładając, że Unix) i zapakuj je z powrotem do jednej dużej biblioteki.źródło
Alternatywnie do
Link Library Dependencies
właściwości projektu istnieje inny sposób łączenia bibliotek w programie Visual Studio.Add Existing Item...
).Item Type
takLibrary
Spowoduje to włączenie innych bibliotek w X, tak jakbyś biegał
źródło
Uwaga, zanim przeczytasz resztę: pokazany tutaj skrypt powłoki z pewnością nie jest bezpieczny w użyciu i dobrze przetestowany. Używaj na własne ryzyko!
Napisałem skrypt basha, aby wykonać to zadanie. Załóżmy, że twoja biblioteka to lib1, a ta, z której musisz dołączyć niektóre symbole, to lib2. Skrypt działa teraz w pętli, gdzie najpierw sprawdza, które niezdefiniowane symbole z lib1 można znaleźć w lib2. Następnie wyodrębnia odpowiednie pliki obiektowe z lib2 za pomocą
ar
, zmienia nieco ich nazwy i umieszcza je w lib1. Teraz może być więcej brakujących symboli, ponieważ rzeczy, które dołączyłeś z lib2, wymagają innych rzeczy z lib2, których jeszcze nie uwzględniliśmy, więc pętla musi zostać uruchomiona ponownie. Jeśli po kilku przebiegach pętli nie ma już żadnych zmian, tj. Żadne pliki obiektowe z lib2 nie zostały dodane do lib1, pętla może się zatrzymać.Zauważ, że dołączone symbole są nadal zgłaszane jako niezdefiniowane przez
nm
, więc śledzę same pliki obiektowe, które zostały dodane do lib1, aby określić, czy pętla może zostać zatrzymana.Nazwałem ten skrypt
libcomp
, więc możesz go wtedy nazwać npgdzie libcokolwiek jest skąd chcesz dołączyć symbole. Uważam jednak, że najbezpieczniej jest najpierw skopiować wszystko do oddzielnego katalogu. Nie ufałbym tak bardzo mojemu skryptowi (jednak zadziałał dla mnie; mógłbym dołączyć libgsl.a do mojej biblioteki numerycznej i pominąć ten przełącznik kompilatora -lgsl).
źródło