Jak wymusić połączenie gcc z nieużywaną biblioteką statyczną
Mam program i bibliotekę statyczną:
// main.cpp
int main() {}
// mylib.cpp
#include <iostream>
struct S {
S() { std::cout << "Hello World\n";}
};
S s;
Chcę połączyć bibliotekę statyczną (libmylib.a
) z obiektem programu (main.o
), chociaż ten ostatni nie używa bezpośrednio żadnego symbolu tego pierwszego.
Poniższe polecenia nie wydają się działać z g++ 4.7
. Będą działać bez błędów i ostrzeżeń, ale najwyraźniej libmylib.a
nie będą linkowane:
g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a
Lub
g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib
Masz jakieś lepsze pomysły? 4 answers
Użyj opcji linkera --whole-archive
.
Biblioteki, które pojawiają się po w wierszu poleceń, nie będą miały odrzuconych niezrealizowanych symboli. Możesz wznowić normalne łączenie poprzez dodanie --no-whole-archive
Po tych bibliotekach.
W twoim przykładzie komenda będzie brzmiała:
g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a
Ogólnie będzie to:
g++ -o program main.o \
-Wl,--whole-archive -lmylib \
-Wl,--no-whole-archive -llib1 -llib2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-02 03:20:58
Oryginalna sugestia była "blisko":
Spróbuj tego: -Wl,--whole-archive -lyourlib
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:23
Inne odpowiedzi bardziej mi się podobają, ale tu jest inne "rozwiązanie".
-
Użyj polecenia ar, aby wyodrębnić wszystkie .o pliki z archiwum.
cd mylib ; ar x /path/to/libmylib.a
-
Następnie dodaj te wszystkie .o files to the linker command
g++ -o program main.o mylib/*.o
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 13:47:00
Jeśli w bibliotece statycznej istnieje określona funkcja, która jest usuwana przez linker jako nieużywana, ale naprawdę jej potrzebujesz (jednym z powszechnych przykładów jest funkcja JNI_OnLoad () ), możesz wymusić, aby linker ją zachował (i oczywiście cały kod wywoływany z tej funkcji). Dodaj -u JNI_OnLoad
do polecenia link.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-10 13:44:10