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

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

本文关键字:不能 构建 dSYM 目录 命令行 clang 为什么      更新时间:2023-10-16

我有一个简单的项目,我想调试想产生dSYM文件夹与调试符号。

运行:

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

创建懒惰。dSYM如我所料

然而:

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

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

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

我不需要一个dSYM目录,只是调试符号,但想了解何时以及为什么它被创建。

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

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

但在其他情况下,它不会这样做。它将调试信息链接步骤留给用户手动执行。您可以通过发出以下命令来实现:
dsymutil <your_program>

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