链接器删除未引用的代码

时间:2016-06-21 09:40:26

标签: c++ linker

我目前正致力于一个模块化项目,我们的一些系统无法正常工作,我会尝试解释我们要做的事情。

我们有一个由多个模块(dll)扩展的主项目,这些模块可以有自举代码,它将在主循环开始之前自行注册。它将使用我们的引导系统注册自己,但是我们的问题是模块不会自己注册,除非我们专门从所述模块调用一个函数。我们认为这是因为链接器删除了未引用的代码作为优化的一部分(这也发生在调试模式中)。

主要功能设置如下:

#include <bootstrap/bootstrapper.hpp>
#include <module/module.hpp>

int main()
{
    // foo is an empty function in the module header file
    foo(); // if I were to remove this empty function, 
           // the modules bootstrapping code will not execute
    return fade::bootstrap::run();
}

没有foo()函数,引导代码不会被执行

void foo()
{

}

namespace
{
    std::unique_ptr<game> game_;
    FADE_BOOTSTRAP_MODULE(module_game) // registers itself to the bootstrapper
}

我们已经尝试了许多内容,例如链接器选项:

  • /包含

  • / OPT:NOREF

  • / EXPORT

但无济于事,要么它给我们未定义的符号错误,要么根本不做任何事情。

我们有什么可以做的,以便未引用的代码不会被优化掉吗?我们希望保持我们的项目模块化和跨平台,所以我们不要硬编码我们的主要功能的任何解决方案。

0 个答案:

没有答案