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

Why does a 2-stage command-line build with clang not generate a dSYM directory?

我有一个简单的项目我想调试想要生成带有调试符号的 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

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

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

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

.dSYM 包的创建是通过名为 dsymutil 的工具完成的。当 Apple 添加对 DWARF 调试信息的支持时,他们决定将 "executable linking" 与 "debug information linking" 分开。因此,调试信息链接不是由普通链接器完成的,它是由 dsymutil.

完成的

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

但在其他情况下,它不会这样做。它将调试信息链接步骤留给用户手动完成。您可以通过简单地发出命令来完成:

dsymutil <your_program>

这里 an article by an Apple engineer who helped design and implement Apple's support for DWARF explaining their thinking. He also answered 关于 Stack Overflow 的一个问题。