Почему двухступенчатая сборка командной строки с clang не создает каталог dSYM?

у меня есть простой проект, который я хочу отладить, хочу создать папку 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 (кажется, что символы встроены в двоичный файл).

к сожалению, 2-ступенчатая сборка - это то, что делает мой измененный makefile. Как я могу генерировать ленивый.dSYM из 2-ступенчатой компиляции и ссылки строить?

Я не нужно каталог dSYM, просто отладочные символы, но хотел бы понять, когда и почему он создается.

1 ответов


создание .dSYM bundle выполняется инструментом dsymutil. Когда Apple добавила поддержку отладочной информации DWARF, они решили отделить "исполняемую ссылку" от "отладочной информации". Таким образом, связывание отладочной информации не выполняется обычным компоновщиком, оно выполняется dsymutil.

для удобства, когда вы создаете программу все за один шаг, компилятор вызывает dsymutil от вашего имени. Это потому, что он знает, что у него есть все входы. Если добавить the -v (a.к. a. --verbose) опция для команды компиляции, вы увидите вызов dsymutil как последний шаг он делает.

в других случаях, однако, он этого не делает. Он оставляет шаг связывания отладочной информации для пользователя вручную. Вы можете сделать это, просто выполните команду:

dsymutil <your_program>

здесь статьи инженером Apple, который помог разработать и реализовать поддержку Apple для карлика, объясняя свое мышление. Он также ответил вопрос здесь, на переполнение стека об этом.