Как заставить gcc связывать неопубликованные, статические объекты С++ из библиотеки
Я использую С++-библиотеку, которая может быть создана как для общей, так и для статической библиотеки.
Эта библиотека использует технику factory, где статические объекты регистрируются при запуске программы и создании статических объектов.
Это работает отлично, пока используется разделяемая библиотека. Когда статическая версия используется, ни один из статических объектов не включается в финальную программу (потому что на них не ссылаются напрямую), и поэтому их функциональность недоступна.
Есть ли способ заставить gcc включать все статические объекты из библиотеки при связывании?
Библиотека - это Open Source, и я могу ее изменить, если это помогает.
Ответы
Ответ 1
Вы можете использовать -Wl,--whole-archive -lyourlib
, см. справочную страницу для ld
для получения дополнительной информации.
Все статические библиотеки, упомянутые после -Wl, - весь архив в командной строке полностью включаются, вы также можете отключить это снова, если вам нужно, как, например, -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib
Ответ 2
Какой-то хак помог мне. Все равно придется включать заголовок, хотя.
// in the header with your class
struct RegistrationHelper {
RegistrationHelper();
};
static RegistrationHelper Helper;
// in your cpp where you register your class
RegistrationHelper::RegistrationHelper() {}