Подтвердить что ты не робот

Как заставить gcc связывать неиспользуемую статическую библиотеку

У меня есть программа и статическая библиотека:

// main.cpp
int main() {}

// mylib.cpp
#include <iostream>
struct S {
    S() { std::cout << "Hello World\n";}
};
S s;

Я хочу связать статическую библиотеку (libmylib.a) с программным объектом (main.o), хотя последний не использует какой-либо символ первого непосредственно.

Следующие команды не работают с g++ 4.7. Они будут работать без каких-либо ошибок или предупреждений, но, по-видимому, libmylib.a не будет связан:

g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a

или

g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib

Есть ли у вас лучшие идеи?

4b9b3361

Ответ 1

Используйте опцию --whole-archive linker.

Библиотеки, которые приходят после него в командной строке, не будут отбрасывать символы без ссылок. Вы можете возобновить нормальное поведение связи, добавив --no-whole-archive после этих библиотек.

В вашем примере команда будет:

g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a

В общем случае это будет:

g++ -o program main.o \
    -Wl,--whole-archive -lmylib \
    -Wl,--no-whole-archive -llib1 -llib2

Ответ 3

Мне нравятся другие ответы лучше, но вот еще одно "решение".

  • Используйте команду ar для извлечения всех файлов .o из архива.

    cd mylib; ar x/path/to/libmylib.a

  • Затем добавьте все эти .o файлы в команду компоновщика

    g++ -o program main.o mylib/*. o

Ответ 4

Если в статической библиотеке есть определенная функция, которая лишена компоновщиком как неиспользуемая, но вам это действительно нужно (один общий пример - функция JNI_OnLoad()), вы можете заставить компоновщик (и, естественно, весь код, который вызывается из этой функции). Добавьте -u JNI_OnLoad в свою ссылку.