Могу ли я скомпилировать все файлы .cpp из src / в .o в obj /, а затем сделать ссылку на двоичный файл в ./? - PullRequest
108 голосов
/ 25 мая 2010

Каталог моего проекта выглядит так:

/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.

У меня почти нет опыта работы с Makefiles, и я не совсем уверен, что искать для достижения этой цели.

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

Ответы [ 2 ]

172 голосов
/ 26 мая 2010

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 $@ $<

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

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

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

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

4 голосов
/ 21 февраля 2014

У меня также есть подстановочный знак, но я бы хотел отметить для тех, кто использует переменные каталога. Всегда используйте косую черту для дерева папок (не обратную косую черту), в противном случае произойдет сбой:

BASEDIR = ../..
SRCDIR = $(BASEDIR)/src
INSTALLDIR = $(BASEDIR)/lib

MODULES = $(wildcard $(SRCDIR)/*.cpp)
OBJS = $(wildcard *.o)
...