C++ Gcc-为什么在发布构建期间不剥离lambda

C++ Gcc-为什么在发布构建期间不剥离lambda,c++,lambda,linker,llvm-clang,C++,Lambda,Linker,Llvm Clang,我正在使用xCode 7在MacOSX上创建一个.component包。我正在尝试去除所有调试符号和库符号以进行版本配置。 我在xCode中设置了所有合适的选项(比如带调试符号,带样式到所有符号,默认隐藏的符号等等) 不幸的是,在编译和链接的组件文件中仍有一些符号可见 所以我使用strip-x-smybundle.component从外部删除它们。它几乎可以工作,但不适用于lambdas调用者。如果任何一个方法正在使用lambda表达式,则生成的二进制文件在链接器“半模糊”样式中包含它的名称以及

我正在使用xCode 7在MacOSX上创建一个
.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设置的符号可供发布。