防止链接器删除全局变量

Dre*_*mer 12 c++ linker global-variables

我使用静态全局变量构造函数作为方便注册函数的技巧,这个想法是这样的:

typedef int (*FuncPtr)(int);

struct RegHelper
{
    RegHelper(const char * Name, FuncPtr Func)
    {
        Register(Name, Func);
    }
}

#define REGISTER(func) RegHelper gRegHelper_ ## func (#func, func);
Run Code Online (Sandbox Code Playgroud)

现在我可以这样注册函数(我用它来实现某种反射):

int Foo(int a)
{
    return a * 123;
}

REGISTER(Foo)

int Bar(int a)
{
    return a * 456;
}

REGISTER(Bar)
Run Code Online (Sandbox Code Playgroud)

问题是,如果我在静态库中使用它,有时链接器会检测到编译单元没有被使用,并且它会丢弃整个内容.所以全局变量没有构造,函数没有注册......

我的问题是:我可以做些什么来解决这个问题?在初始化期间调用每个编译单元中的虚函数似乎触发了全局变量的构造,但这并不觉得非常安全.还有其他建议吗?

小智 1

是的,我也遇到过这个问题。我发现的唯一可靠的方法是:

  • 将库变成DLL

或者:

  • 将注册对象移动到可执行文件中

这些都不是完美的,尽管如果您不介意使用 DLL,DLL 解决方案也可以,而且我也有兴趣了解其他解决方案。