C++ Gcc-为什么在发布构建期间不剥离lambda
我正在使用xCode 7在MacOSX上创建一个C++ Gcc-为什么在发布构建期间不剥离lambda,c++,lambda,linker,llvm-clang,C++,Lambda,Linker,Llvm Clang,我正在使用xCode 7在MacOSX上创建一个.component包。我正在尝试去除所有调试符号和库符号以进行版本配置。 我在xCode中设置了所有合适的选项(比如带调试符号,带样式到所有符号,默认隐藏的符号等等) 不幸的是,在编译和链接的组件文件中仍有一些符号可见 所以我使用strip-x-smybundle.component从外部删除它们。它几乎可以工作,但不适用于lambdas调用者。如果任何一个方法正在使用lambda表达式,则生成的二进制文件在链接器“半模糊”样式中包含它的名称以及
.component
包。我正在尝试去除所有调试符号和库符号以进行版本配置。
我在xCode中设置了所有合适的选项(比如带调试符号
,带样式
到所有符号
,默认隐藏的符号
等等)
不幸的是,在编译和链接的组件
文件中仍有一些符号可见
所以我使用strip-x-smybundle.component
从外部删除它们。它几乎可以工作,但不适用于lambdas
调用者。如果任何一个方法正在使用lambda
表达式,则生成的二进制文件在链接器“半模糊”样式中包含它的名称以及所有被调用方和调用方,如lambda
本身,如ZN18MyClassName8MetodNameEP9BSFirstParamP7SecondParamE3$\u 1
所以这看起来像是链接器的问题
例如,一些代码:
class AClass {
public:
void methodCallingCallbackInTheEnd();
std::function<void(C*, D*)> myCallback;
}
class BClass {
AClass a;
CClass *c;
DClass *d;
public:
methodOfClassB() {
a->callback = [c,d] (C* c, D* d) {
//do something with c and d objects
};
a->methodCallingCallbackInTheEnd();
}
}
class EClass {
public:
EMethodNotVisibleInBinary();
}
类AClass{
公众:
void方法调用callbackintheend();
std::函数myCallback;
}
B类{
a组;
c类*c;
d类*d;
公众:
methodOfClassB(){
a->callback=[c,d](c*c,d*d){
//对c和d对象执行一些操作
};
a->methodcallbackintheend();
}
}
类电子课堂{
公众:
EMethodNotVisibleInBinary();
}
因此,作为编译和链接的一种效果,我可以在二进制文件中看到A和B类的一些条目,即使参数类型为C和D,如下所示:
ZN18AClass8callbackE34$\u 2
接下来是关于回调本身的一些信息,如:
zn18bclass8methodofclassbep9bsclassp7dclass3$\u 1
有没有办法摆脱他们?为什么它们会出现<代码>电子课堂,eMethodNotVisibleInnary
等当然不可见。.component
文件中没有此类字符串
这对我来说非常重要,当然我不想混淆这些部分
有什么想法吗?请给出一个我们可以实际编译的测试用例……你为什么在意?你是否担心有人会对你的代码进行反向工程?完全优化的构建不会因为几个lambda符号而更容易反编译。如果要构建动态库,则需要一些符号。我为什么关心这些?因为这些名字对我的许可证管理至关重要,而且它们一直存在@MarcGlisse无法准备测试用例-当尝试准备这样的测试用例时-它根本没有具有相同xCode设置的符号可供发布。