如何强制gcc链接库中未引用的静态C ++对象

时间:2011-01-22 12:58:03

标签: c++ linux gcc static-linking static-initialization

我正在使用可以构建为共享库或静态库的C ++库。 该库使用工厂技术,其中静态对象在程序启动时自行注册,并创建静态对象。

只要使用共享库,这样就可以正常工作。当使用静态版本时,没有任何静态对象被包含在最终程序中(因为它们没有被直接引用),因此它们的功能不可用。

有没有办法在链接时强制gcc包含库中的所有静态对象?

该库是开源的,我可以修改它,如果有帮助的话。

3 个答案:

答案 0 :(得分:23)

您可以使用-Wl,--whole-archive -lyourlib,请参阅ld的联机帮助页以获取更多信息。

在-Wl之后提到的任何静态库, - 命令行上的整个存档都被完全包含在内,如果需要,你可以再次关闭它,例如在-Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

答案 1 :(得分:2)

一种黑客帮助了我。尽管如此,仍然必须包括标题。

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

static RegistrationHelper Helper;

// in your cpp where you register your class
RegistrationHelper::RegistrationHelper() {}

答案 2 :(得分:1)

使用:

g++ -u <SYMBOL_NAME> ...

请注意, -u 是小写