Почему двухступенчатая сборка командной строки с 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 для карлика, объясняя свое мышление. Он также ответил вопрос здесь, на переполнение стека об этом.