Я могу скомпилировать все .cpp файлы в src/к .o's в obj/, затем связаться с двоичным файлом в./?

Мой каталог проекта похож на это:

/project
    Makefile
    main
    /src
        main.cpp
        foo.cpp
        foo.h
        bar.cpp
        bar.h
    /obj
        main.o
        foo.o
        bar.o

То, что я хотел бы, чтобы мой make-файл сделал, должно будет скомпилировать все .cpp файлы в /src папка к .o файлы в /obj папка, затем свяжитесь весь .o файлы в /obj в выходной двоичный файл в папке верхнего уровня /project.

Я не имею рядом ни с каким опытом с Make-файлами, и не действительно уверено, что искать для выполнения этого.

Кроме того, действительно ли это - "хороший" способ сделать это или является там более стандартным подходом к тому, что я пытаюсь сделать?

112
задан Toby Speight 3 October 2016 в 18:21
поделиться

1 ответ

Makefile часть вопроса

Это довольно просто, если вам не нужно обобщать попробуйте что-то вроде приведенного ниже кода (но замените пробельные отступы на табуляции в g++)

SRC_DIR := .../src
OBJ_DIR := .../obj
SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))
LDFLAGS := ...
CPPFLAGS := ...
CXXFLAGS := ...

main.exe: $(OBJ_FILES)
   g++ $(LDFLAGS) -o $@ $^

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
   g++ $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

Автоматическая генерация графа зависимостей

Обязательная функция для большинства систем make. В GCC это можно сделать за один проход как побочный эффект компиляции, добавив флаг -MMD к CXXFLAGS и -include $(OBJ_FILES:.o=.d) в конец тела makefile:

CXXFLAGS += -MMD
-include $(OBJ_FILES:.o=.d)

И, как ребята уже говорили, всегда имейте при себе GNU Make Manual, это очень полезно.

174
ответ дан 24 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: