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