有选择地禁用库中的死代码消除
selectively disable dead code elimination in a library
我有很多cpp文件,其中一些具有自行订阅事件的函数。不幸的是,如果没有明显的函数调用,大多数链接器将从编译单元中删除所有符号。有没有办法强制链接这些订阅功能?我不想完全禁用死代码剥离,因为我可能会错过其他翻译单元的很多机会。
订户.cpp:
Event &someEvent();
void doSomething()
{
printf("doing somethingn");
}
class Initializer
{
public: Initializer()
{
// I need this function to be kept
someEvent().subscribe(&doSomething);
}
} initializer;
主.cpp:
Event &someEvent();
int main()
{
someEvent().dispatch();
}
谢谢
编辑:
下面是一个重现版本:https://github.com/malytomas/deadCodeElimination (感谢 Ayjay 的帮助,即使他/她的示例没有重现该问题。
此问题仅发生在库中。 (感谢俄语提出这个问题。
不幸的是,如果没有明显的函数调用,大多数链接器将从编译单元中删除所有符号。
你错了:一个可以做到这一点的链接器将是一个损坏的链接器。链接器不会对注册全局构造函数或析构函数的代码进行垃圾回收。
最有可能发生的事情是,您的目标文件甚至没有被选中到链接中(而不是从存档库中提取(。这篇文章很好地解释了许多链接器用来确定选择和未选择的算法。
更新:
现在我们可以看到一个重现,您的实际问题与死代码消除无关。正如我所怀疑的,subscriber.o
根本没有从libsubscriber.a
拉入,因为链接器找不到这样做的理由。
这是实际的链接命令:
/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main libsubscriber.a
这是您想要的命令:
/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main
-Wl,--whole-archive libsubscriber.a -Wl,--nowhole-archive
我不知道如何使用CMake实现这一目标,对不起。
或者,您也可以通过以下方式达到预期效果:
/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main
-u _Z19forceLinkSubscriberv libsubscriber.a
相关文章:
- 有选择地禁用第三方库的C++核心准则检查器
- 有选择地禁用库中的死代码消除
- C++,有选择地应用模板模式来发挥作用
- 使用 SFINAE 有选择地实例化模板的成员函数
- 有选择地隐藏类成员的成员
- 有选择地启用一个并行区域内的OpenMP进行循环
- 有选择地对向量 c++ 进行排序
- 有选择地替换 C++ 中 std::string 中的 (") 双引号
- 我可以在代码库中有选择地禁用RTTI以减少二进制尺寸
- 如何有选择地从缓冲区读取数据
- 有选择地覆盖模板化类的函数
- 有选择地编译框架C++的方法
- 运算符 = 重载C++有选择地工作
- 有选择地内联函数(用于调试目的)
- 为什么这段代码重复地只从字符串流中提取第一个字符串
- 我可以使用 SFINAE 有选择地定义模板类中的成员变量吗?
- 在空格上有选择地分割字符串
- 我如何修复我的代码选择排序
- 如何*有选择地*修改由随机数生成的多维数组?
- 在Java中使用SWIG,我如何有选择地SWIG一个巨大的C/ c++头文件的某些部分