我使用clang++
使用以下命令行命令(拆分为行)构建了我的C ++项目:
clang++
-std=c++11
-W -Wall -Wextra -pedantic -Wno-newline-eof -Werror
-O4
-I<dirs>
-L<dirs>
-l<libs>
-framework <frameworks>
-D <defs>
-o <filename>
<files>
但是,当我运行strings <filename>
时,尽管命令行中有-O4
,但仍显示多个类名。我已经尝试了-Wl,-s
,它应该告诉llvm剥离所有符号,但这并不会删除它们。
出现的类名似乎都有一个共同点:它们有一个vtable。其中一个类是:
class MyClass {
public:
virtual void myFunc() = 0;
};
它显示为符号:
N9namespace7MyClassE
我不喜欢我的命名空间和类名出现在最终文件中。如何剥离这些?我的二进制文件是命令行实用程序,因此只应导出main
函数。
即使在提供-fno-rtti
(正如@n.m。建议)之后,仍有一些名称仍然存在,例如:
__ZN15MyClassInstance6myFuncEv
(MyClassInstance是上面MyClass的子类)
此外,即使全局变量的名称也在二进制文件中。
答案 0 :(得分:1)
我通过提供clang参数-fno-rtti
解决了这个问题,该参数禁用了RTTI,这是我不使用的C ++特性。
[编辑]
看起来-O4
并不意味着strip
,并且可以通过执行strip
删除对我的类名称的最后几个引用。