You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链接器从静态库中丢弃全局变量(及其构造函数)的问题求助

链接器从静态库中丢弃全局变量(及其构造函数)的问题求助

各位大佬,我碰到个头疼的问题想请教:我写了一个单例注册表,用来把名称和函数指针做映射;另外还有个注册器对象,它的构造函数会自动完成函数指针的注册操作。

我本来打算把这些函数和注册表都打包到静态库里,但构建之后发现,链接器居然丢弃了这些注册逻辑!

为了方便大家理解,我把代码做了简化处理——把函数指针换成了全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:58:10