У меня есть программа и статическая библиотека:
// 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
У вас есть идеи получше?
использование --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
Первоначальное предложение было «близко»:
Попробуй это: -Wl,--whole-archive -lyourlib
Мне больше нравятся другие ответы, но вот еще одно «решение».
Используйте команду ar для извлечения всех .o файлов из архива.
cd mylib ; ar x /path/to/libmylib.a
Затем добавьте все эти файлы .o в команду компоновщика
g++ -o program main.o mylib/*.o
Если в статической библиотеке есть определенная функция, которая компоновщиком удаляется как неиспользуемая, но она вам действительно нужна (один общий пример: JNI_OnLoad () функция), вы можете заставить компоновщик сохранить его (и, естественно, весь код, который вызывается из этой функции). добавлять -u JNI_OnLoad
на вашу команду ссылки.