为什么使用clang的2阶段命令行构建不会生成dSYM目录?

jbc*_*coe 15 c++ debugging macos debug-symbols

我有一个简单的项目,我想调试想生成带调试符号的dSYM文件夹.

运行:

clang++ -std=c++14 -stdlib=libc++ -g -o Lazy Lazy.cpp

像我期望的那样创建Lazy.dSYM.

然而:

clang++ -std=c++14 -stdlib=libc++ -g -c Lazy.cpp
clang++ -stdlib=libc++ -g -o Lazy Lazy.o
Run Code Online (Sandbox Code Playgroud)

不创建Lazy.dSYM(似乎符号嵌入在二进制文件中).

遗憾的是,两步构建是我修改后的makefile所做的.如何从两阶段编译和链接构建生成Lazy.dSYM?

不需要 dSYM目录,只需调试符号,但想了解它的创建时间和原因.

Ken*_*ses 17

.dSYM包的创建由一个名为的工具完成dsymutil.当Apple添加对DWARF调试信息的支持时,他们决定将"可执行链接"与"调试信息链接"分开.因此,调试信息链接不是由普通链接器完成的,而是由它完成的dsymutil.

为方便起见,当您一步构建程序时,编译器dsymutil将代表您调用.那是因为它知道它拥有所有输入.如果将-v(aka --verbose)选项添加到compile命令,您将看到dsymutil它作为最后一步的调用.

但在其他情况下,它并没有这样做.它为用户手动完成调试信息链接步骤.您可以通过发出命令来完成:

dsymutil <your_program>
Run Code Online (Sandbox Code Playgroud)

这是Apple工程师的一篇文章,他帮助设计和实现了Apple对DWARF的支持,解释了他们的想法.他还在Stack Overflow上回答了关于这个问题的问题.