Как создать отладочную информацию в gcc/clang с отдельным процессом компиляции / компоновки в Makefile (-c -g)?

Я сделал Makefile из блога Хилтона Липшица и внес в него небольшие изменения, чтобы генерировать отладочную информацию. Основные части перечислены:

CC := clang -arch x86_64
CFLAGS := -c -O0

$(TARGET): $(OBJECTS)
    @echo "  Linking $(TARGET)"; $(CC) $^ -o $(TARGET) $(LIB)

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
    @mkdir -p $(BUILDLIST)
    @echo "Compiling $<..."; $(CC) $(CFLAGS) $(INC) -o $@ $<

debug: CFLAGS += -g
debug: $(TARGET)

Сейчас make выполняет эти команды (пути суммируются с ...):

clang -arch x86_64 -c -O0 -I... -o build/program.o src/program.c
clang -arch x86_64 build/program.o -o bin/program -L...

В то время как make debug запускает эти команды:

clang -arch x86_64 -c -O0 -g -I... -o build/program.o src/program.c
clang -arch x86_64 build/program.o -o bin/program -L...

Проблема в том, когда я выполняю make или же make debug нет program.dSYM подпапка будет сделана в bin папка. Вместо этого, когда я компилирую без -c аргумент:

clang -arch x86_64 -g -O0 -I... -L... -o bin/program.o src/program.c

как исполняемый файл, так и .dSYM созданы в bin папка.

  1. Как я могу добавить функцию генерации отладочной информации в этот Makefile при разделении процесса компиляции и компоновки?
  2. На каком этапе (компиляция / компоновка) производится отладочная информация?

ОБНОВЛЕНИЕ: я создал репозиторий GitHub и загрузил связанный Makefile и исходный код. Чтобы воспроизвести проблему, выполните следующие команды в своем терминале:

git clone https://github.com/hamid914/gdb-lldb-test.git
cd gdb-lldb-test
make debug

Последняя строка, make debug выполняет эти команды:

clang -arch x86_64 -c -O0 -std=c11 -g -I include -I include/libs -I /usr/local/include -o build/program.o src/program.c
clang -arch x86_64 build/program.o -o bin/program -L /usr/local/lib -lm -g

И содержание bin папка есть:

$ ls bin
program

Хотя если я бегу clang без -c аргумент:

clang -arch x86_64 -O0 -std=c11 -g -I include -I include/libs -I /usr/local/include -L /usr/local/lib -lm -o bin/program src/program.c

Содержание bin папка:

$ ls bin
program      program.dSYM

1 ответ

Вам нужно добавить -g к рецептуру компоновщика, а также для генерации файлов.dSYM стандартным способом было бы добавить

debug: LDFLAGS += -g

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

Другие вопросы по тегам