我需要从大型C ++项目中删除未使用的函数。阅读一段时间后,我使用了这个链接:How can I know which parts in the code are never used?
我使用makefile在RedHat上编译。我在编译器中添加了标志:
-Wall -Wconversion -ffunction-sections -fdata-sections
和链接器标志:
的 -Wl 下, - rpath中,的 - 还原函数, - GC-段, - 打印-GC-部分
出于某些恼人的原因,即使在使用 - demangle 选项后,我也会在修改后收到输出。例如:
/usr/bin/ld: Removing unused section '.text._ZN8TRACABLED0Ev' in file 'CMakeFiles/oded.dir/oded.cpp.o'
/usr/bin/ld: Removing unused section '.text._ZN8TRACABLED1Ev' in file 'CMakeFiles/oded.dir/oded.cpp.o'
所以我有6000个函数名称需要解开,我不能使用extern C
。
我可以编写一个脚本来解析它并使用 c ++ filt ,但我正在寻找一种解决方案,让链接器自己解开函数!
任何人都知道这种解决方案是否存在?
答案 0 :(得分:1)
出于某些恼人的原因,即使在使用--demangle选项
之后,我也会在修改后收到输出
来自man ld
:
--demangle[=style]
--no-demangle
These options control whether to demangle symbol names in
error messages and other output.
但是这些消息:
Removing unused section '.text._ZN8TRACABLED0Ev' in file
不关于符号名称。它们是关于部分的名称,恰好有时包含符号名称。所以这是有记录的。
现在,如果你真的想对它做点什么,你可以开发一个链接补丁来解码部分名称,并将其发送给GNU binutils维护者。
但更简单的选择可能是通过c++filt
简单地管理您想要解组的邮件。例如:
echo "Removing unused section '.text._ZN8TRACABLED0Ev' in file" |
sed -e 's/_ZN/ _ZN/' | c++filt
产生
Removing unused section '.text. TRACABLE::~TRACABLE()' in file