C++ 去除符号的最佳方法

C++ 去除符号的最佳方法,c++,c,visual-c++,gcc,symbols,C++,C,Visual C++,Gcc,Symbols,上周,我发布了一个应用程序的Linux和windows版本 在发布之后,我们意识到这些符号并没有被去除,我的经理认为(我不同意)这可能会让用户理解我们的算法 无论如何,现在,我必须清理符号并重新发布应用程序 我的问题, 在Linux中剥离符号的最佳方法是什么 在窗口中去除符号的最佳方法是什么 Windows上使用VisualC++(以及其他微软编译器),符号不是二进制文件的一部分。相反,它们存储在称为“程序数据库”文件(.pdb文件)的单独文件中。只是不要提供.pdb文件 使用GNU工具链,您

上周,我发布了一个应用程序的Linux和windows版本

在发布之后,我们意识到这些符号并没有被去除,我的经理认为(我不同意)这可能会让用户理解我们的算法

无论如何,现在,我必须清理符号并重新发布应用程序

我的问题,

  • 在Linux中剥离符号的最佳方法是什么
  • 在窗口中去除符号的最佳方法是什么
  • Windows上使用VisualC++(以及其他微软编译器),符号不是二进制文件的一部分。相反,它们存储在称为“程序数据库”文件(.pdb文件)的单独文件中。只是不要提供.pdb文件


    使用GNU工具链,您可以使用
    strip
    从二进制文件中删除符号。

    对于GNU工具链,有一个很酷的技巧:

    objcopy --only-keep-debug yourprogram ../somepath/yourprogram.dbg
    strip yourprogram
    objcopy --add-gnu-debuglink=../somepath/yourprogram.dbg yourprogram
    
    现在,您可以压缩程序所在的文件夹(或将其打包到安装程序或其他任何地方),其中将不再有调试符号。
    但是:如果启动调试器,或者运行类似于
    addr2line
    obdump
    的工具,该工具将(由于debuglink信息)自动知道在何处查找符号并加载它们


    这真是太棒了,因为这意味着您可以在终端上安装符号,而无需将符号分发给用户。

    我认为调试符号可以帮助人们理解您的算法。如果他们在程序执行的各个点检查调用堆栈,并且可以看到描述性的函数名,那么…根据应用程序的构建方式,剥离也可以将应用程序占用空间减少很多(特别是在使用大量静态库的情况下)!一般来说,对于您运送的任何物品,剥离都是一种很好的做法。如果您有私人ms pdb,并且希望将其转换为公共的,您可以勾选此答案