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?
 30
Author: Martin, 2013-01-02

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
 45
Author: Alex B,
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

 6
Author: paulsm4,
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".

  1. Użyj polecenia ar, aby wyodrębnić wszystkie .o pliki z archiwum.

    cd mylib ; ar x /path/to/libmylib.a
    
  2. Następnie dodaj te wszystkie .o files to the linker command

    g++ -o program main.o mylib/*.o
    
 4
Author: brian beuning,
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.

 2
Author: Alex Cohn,
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