Как заставить 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

У вас есть идеи получше?

31

Решение

использование --whole-archive опция компоновщика.

Библиотеки, которые приходят после в командной строке не будут удалены символы, на которые нет ссылок. Вы можете возобновить нормальное поведение ссылок, добавив --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
46

Другие решения

Первоначальное предложение было «близко»:

Попробуй это: -Wl,--whole-archive -lyourlib

7

Мне больше нравятся другие ответы, но вот еще одно «решение».

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

    cd mylib ; ar x /path/to/libmylib.a
    
  2. Затем добавьте все эти файлы .o в команду компоновщика

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

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

3
По вопросам рекламы [email protected]