【发布时间】:2020-02-07 07:43:57
【问题描述】:
我有很多 cpp 文件,其中一些具有自订阅事件的功能。不幸的是,如果没有明显的函数调用,大多数链接器将从编译单元中删除所有符号。有没有办法强制链接这些订阅功能?我不想完全禁用死代码剥离,因为我可能会错过很多其他翻译单元的机会。
订阅者.cpp:
Event &someEvent();
void doSomething()
{
printf("doing something\n");
}
class Initializer
{
public: Initializer()
{
// I need this function to be kept
someEvent().subscribe(&doSomething);
}
} initializer;
Main.cpp:
Event &someEvent();
int main()
{
someEvent().dispatch();
}
谢谢
编辑:
这是一个复制版本:https://github.com/malytomas/deadCodeElimination (感谢 Ayjay 的帮助,即使他/她的示例没有重现问题。)
问题只发生在库中。 (感谢 Employed Russian 提出这个问题。)
【问题讨论】:
-
“大多数链接器” - 第一个列表中的特定代码被错误地...“消除”了?此外,链接器不会从“编译单元”中删除代码;他们将其从链接目标中剥离。只有在确保它没有被引用之后。
doSomething在第一个清单中明确提到,那么您实际上在谈论哪个代码?一个真实的 minimal reproducible example 可能会大大有助于放大您的问题。 -
在玩弄了这段代码以使其实际编译之后(你为什么不这样做?),它似乎工作正常。 Godbolt。您的实际问题是什么?您能否链接一个实际演示该问题的代码示例?
-
我已经创建了实际工作的示例。它需要多个文件(显然还需要一个库),这就是我一开始没有编写它的原因。很抱歉让您感到困惑。
标签: c++ visual-c++ linker g++ dead-code