![](/img/trans.png)
[英][MAKEFILE]: How to copy cpp source files from different source folders into one destination folder and use those cpp files to build using MAKE
[英]Makefile with different source folder for test target
我對 C++ 生成文件非常陌生,我有下面的生成文件,我主要是從互聯網上的某個地方復制的。 我對 makefile 的貢獻是“測試”目標,這就是問題所在。
我的代碼組織在include (用於標題)、 src (用於源)和test (用於測試源)目錄中。 對於標准目標,我想在 src 文件夾中構建所有文件,其中還包括 main.cpp 文件。 為了進行測試構建,我想構建src文件夾中除main.cpp 之外的所有文件以及test文件夾中的所有文件。 我希望我的測試目標能夠實現這一目標,但它失敗了。 它只是從標准目標構建文件。
我該如何糾正我的錯誤。
謝謝
我使用的生成文件:
APP=myappname
SRC_DIR=src
INC_DIR=include
OBJ_DIR=obj
BIN_DIR=bin
TEST_SRC_DIR=test
MAIN_CPP_NAME=main.cpp
CC=g++
LD=g++
CFLAGS=-O2 -c -Wall -std=c++17
LFLGAS=
DFLAGS=-g3 -O0 -DDEBUG
INCFLAGS=-I$(INC_DIR)
SOURCES=$(wildcard $(SRC_DIR)/*.cpp)
HEADERS=$(wildcard $(INC_DIR)/*.hpp)
OBJECTS=$(SOURCES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
DEPENDS=$(OBJ_DIR)/.depends
.PHONY: all
all: $(BIN_DIR)/$(APP)
.PHONY: debug
debug: CFLAGS+=$(DFLAGS)
debug: all
.PHONY: test
test: SOURCES=$(wildcard $(SRC_DIR)/*.cpp)
test: SOURCES=$(filter-out $(SRC_DIR)/$(MAIN_CPP_NAME), $(SOURCES))
test: OBJECTS=$(SOURCES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
test: TEST_SOURCES=$(wildcard $(TEST_SRC_DIR)/*.cpp)
test: OBJECTS+=$(TEST_SOURCES:$(TEST_SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
test: all
$(BIN_DIR)/$(APP): $(OBJECTS) | $(BIN_DIR)
$(LD) $(LFLGAS) -o $@ $^
$(OBJ_DIR)/%.o: | $(OBJ_DIR)
$(CC) $(CFLAGS) $(INCFLAGS) -o $@ $<
$(DEPENDS): $(SOURCES) | $(OBJ_DIR)
$(CC) $(INCFLAGS) -MM $(SOURCES) | sed -e 's!^!$(OBJ_DIR)/!' >$@
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPENDS)
endif
$(BIN_DIR):
mkdir -p $@
$(OBJ_DIR):
mkdir -p $@
.PHONY: clean
clean:
rm -rf $(BIN_DIR) $(OBJ_DIR)
您試圖在不了解基礎知識的情況下編寫復雜的 makefile,這幾乎是不可能的。 讓我們嘗試一個非常簡單的方法。
首先,假設源文件是
src/main.cpp
src/func.cpp
test/unit.cpp
test/global.cpp
現在我們需要一個test
需要的目標文件列表。
SOURCES:=$(wildcard $(SRC_DIR)/*.cpp) # this will be src/main.cpp src/func.cpp
NON_MAIN_SOURCES:=$(filter-out $(SRC_DIR)/$(MAIN_CPP_NAME), $(SOURCES)) # this will be src/func.cpp
TEST_DIR_SOURCES:=$(wildcard $(TEST_SRC_DIR)/*.cpp) # this will be test/unit.cpp test/global.cpp
TEST_SOURCES:=$(notdir $(NON_MAIN_SOURCES) $(TEST_DIR_SOURCES)) # this will be func.cpp unit.cpp global.cpp
TEST_OBJECTS:=$(patsubst %.cpp,$(OBJ_DIR)/%.o,$(TEST_SOURCES)) # this will be obj/func.o obj/unit.o obj/global.o
(請注意,您必須避免src/
和test/
之間的名稱沖突,例如具有src/func.cpp
和test/func.cpp
。這是您的目錄結構的結果;makefile test/func.cpp
它。)
現在我們必須告訴 Make 如何構建這些目標文件。 我們可以從src
的源規則開始:
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CC) $(CFLAGS) $(INCFLAGS) -o $@ $<
(為了簡單起見,我省略了$(OBJ_DIR)
先決條件。現在,您將負責確保obj/
存在。)
現在是test
的來源。 一種粗略但有效的方法是為它們添加規則:
$(OBJ_DIR)/%.o: $(TEST_DIR)/%.cpp
$(CC) $(CFLAGS) $(INCFLAGS) -o $@ $<
還有更復雜的方法,但你必須先掌握基礎知識。
最后,構建bin/mytestname
的規則:
$(BIN_DIR)/mytestname: $(TEST_OBJECTS)
$(LD) $(LFLAGS) -o $@ $^
現在就夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.