Как заставить gcc связать статические объекты C ++ из библиотеки, на которые нет ссылок, из библиотеки - PullRequest
23 голосов
/ 22 января 2011

Я использую библиотеку C ++, которая может быть построена как разделяемая или статическая библиотека.В этой библиотеке используется фабричный метод, при котором статические объекты регистрируются при запуске программы и создании статических объектов.

Это прекрасно работает, если используется общая библиотека.Когда используется статическая версия, ни один из статических объектов не включается в конечную программу (потому что на них нет прямых ссылок) и, следовательно, их функциональность недоступна.включать все статические объекты из библиотеки при компоновке?

Библиотека с открытым исходным кодом, и я могу изменить ее, если это поможет.

Ответы [ 3 ]

24 голосов
/ 22 января 2011

Вы можете использовать -Wl,--whole-archive -lyourlib, см. Справочную страницу для ld для получения дополнительной информации.

Любые статические библиотеки, упомянутые после -Wl, - весь архив в командной строке полностью включается, вы можетеотключите это снова, если вам нужно, как, например, -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

2 голосов
/ 09 сентября 2011

Какой-то взлом помог мне. Все еще должен включать заголовок, хотя.

// in the header with your class
struct RegistrationHelper {
    RegistrationHelper();
};

static RegistrationHelper Helper;

// in your cpp where you register your class
RegistrationHelper::RegistrationHelper() {}
1 голос
/ 28 сентября 2018

Использование:

g++ -u <SYMBOL_NAME> ...

Обратите внимание, что -u строчные

...