链接器从静态库中丢弃全局变量(及其构造函数)的问题求助
链接器从静态库中丢弃全局变量(及其构造函数)的问题求助
各位大佬,我碰到个头疼的问题想请教:我写了一个单例注册表,用来把名称和函数指针做映射;另外还有个注册器对象,它的构造函数会自动完成函数指针的注册操作。
我本来打算把这些函数和注册表都打包到静态库里,但构建之后发现,链接器居然丢弃了这些注册逻辑!
为了方便大家理解,我把代码做了简化处理——把函数指针换成了全局int的指针,注册表的关联容器换成了vector,简化后的示例代码如下:
#include <vector> // 单例注册表类 class Registry { public: // 获取单例实例 static Registry& Instance() { static Registry instance; return instance; } // 注册指针 void Register(int* ptr) { items_.push_back(ptr); } private: Registry() = default; ~Registry() = default; Registry(const Registry&) = delete; Registry& operator=(const Registry&) = delete; std::vector<int*> items_; }; // 注册器类:构造时自动注册 class Registrar { public: explicit Registrar(int* ptr) { Registry::Instance().Register(ptr); } }; // 全局变量及对应的注册器 int global_foo = 42; Registrar registrar_foo(&global_foo); int global_bar = 100; Registrar registrar_bar(&global_bar);
现在的问题是,当我把这些代码编译成静态库,然后在主程序中引用这个库并使用Registry时,发现global_foo和global_bar并没有被注册进去——显然链接器把registrar_foo和registrar_bar这些全局对象给优化掉了,连它们的构造函数都没执行!
备注:内容来源于stack exchange,提问作者Adrian McCarthy
相关产品推荐
相关产品推荐

