Buduję program z autoconf, automake i libtool. Moja praca wymaga statycznego łączenia (większości) bibliotek. Nie było to w przeszłości problemem, ponieważ mogłem statycznie powiązać wszystko z -all-static
. Teraz jest to problem, ponieważ muszę korzystać z biblioteki, która jest tylko dynamiczna; zostało nam dane przez osobę trzecią, a my nie mamy źródła.W jaki sposób użytkownik automatyczny może określić kombinację łączenia statycznego i dynamicznego?
Oczywiście, -all-static
powoduje teraz awarię kompilacji. Czy jest możliwe aby powiedzieć libtool statycznie połączyć wszystko, z wyjątkiem tej jednej biblioteki? Czy jest możliwe, aby libtool zawierał dowolne połączenie statycznego i dynamicznego łączenia, czy to wszystko czy nic?
Do tej pory próbowałem stworzyć bibliotekę wygody z LDFLAGS = -static
, która zależy od bibliotek, które chcę statycznie połączyć. Ale libtool nie łączy statycznych bibliotek, tak jak bym sobie tego życzył. Program w zależności od biblioteki wygody wciąż dynamicznie łączy wszystko.
Próbowałem również --disable-shared
, ale to nie miało wpływu na kompilację.
Te pytania są podobne, ale tak naprawdę nie jest odpowiedź na moje pytanie:
Force linking a static library into a shared one with Libtool
Is it possible to link some — but not all — libraries statically with libtool?
(nie chcę usunąć biblioteki współdzielone z mojego systemu, a określanie pełnej ścieżki dla wszystkiego nie jest lepsze niż łączenie ręczne, ale może to jedyny sposób.)
Działa to, ale z powodu braku pewnej elastyczności.Nie potrzebuję dynamicznej kompilacji, ale gdybym to zrobił, musiałbym edytować plik 'Makefile.am', prawda? Powoduje to również problemy z makrami, takimi jak 'AC_CHECK_LIB' (które po prostu dodaje' -l' do 'LIBS'), ale myślę, że tego można się spodziewać. – tprk77
Podałem najprostsze możliwe podejście. Jednak, na coś wyszukanego, możesz przeciągnąć flagi do 'configure.ac'. Tam możesz dodać 'DYNLIBS =" - Wl, -Bdynamic, -L/path/to, -lshared, -Bstatic "' z wywołaniem 'AC_SUBST ([DYNLIBS])'. Następnie wystarczy wywołać '$ (DYNLIBS)' w pliku 'Makefile.am'. To da ci większą kontrolę, ale pamiętaj, że 'AC_CHECK_LIBS' nie sprawdza bibliotek statycznych vs. dynamicznych. Czy to jest to, czego chcesz, czy jest coś jeszcze, co uczyniłoby to bardziej elastycznym? – NickW
Tak, myślę, że to zadziała, dzięki! – tprk77