我試圖更新我的Makefile以支持構建我的項目的二進制文件,以及一些單元測試的二進制文件。Makefile支持2個可執行文件
我的目錄結構如下
|-code/
|--|--src/
|--|--inc/
|
|-tests/
|--|--src/
|--|--inc/
我的makefile文件彙集了來自碼二進制很好,但有與測試的一些問題。測試文件夾包含一些單元測試,用於測試code/src /中的某些類。我在代碼/ src /中包含main()函數的main.cpp文件,以及另一個名爲test.cpp的文件,該文件在tests/src中包含自己的main()函數。
這使我這個複雜的Makefile:
CC = g++
FLAGS = -g -c -Wall
INCLUDEDIR = -Icode/inc -Itests/inc
BUILDDIR = build
SOURCEDIR = code/src
SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCEDIR)))
TEMP_OBJ = $(SOURCES:%.cpp=%.o)
NOT_DIR = $(notdir $(TEMP_OBJ))
OBJECTS = $(addprefix $(BUILDDIR)/, $(NOT_DIR))
TEST_DIR = tests/src
TEST_SOURCES = $(wildcard $(addsuffix /*.cpp,$(TEST_DIR)))
TEST_TEMP_OBJ = $(TEST_SOURCES:%.cpp=%.o)
TEST_NOT_DIR = $(notdir $(TEST_TEMP_OBJ))
TEST_OBJECTS = $(addprefix $(BUILDDIR)/, $(TEST_NOT_DIR))
EXECUTABLE = Client
TEST_EXECUTABLE = TestUnit
all: $(BUILDDIR) $(BUILDDIR)/$(EXECUTABLE) $(BUILDDIR)/$(TEST_EXECUTABLE)
$(BUILDDIR):
mkdir -p [email protected]
$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS)
$(CC) $^ -o [email protected]
$(BUILDDIR)/%.o : code/src/%.cpp
$(CC) $(FLAGS) $< $(INCLUDEDIR) -o [email protected]
$(BUILDDIR)/$(TEST_EXECUTABLE): $(OBJECTS) $(TEST_OBJECTS)
@rm -f $(BUILDDIR)/main.o
$(CC) $^ -o [email protected]
$(BUILDDIR)/%.o : tests/src/%.cpp
$(CC) $(FLAGS) $< $(INCLUDEDIR) -o [email protected]
clean:
rm -rf $(BUILDDIR)
它失敗,出現錯誤:
g++: error: build/main.o: No such file or directory
make: *** [build/TestUnit] Error 1
這是因爲我有一行:
@rm -f $(BUILDDIR)/main.o
但除此之外,我會得到錯誤(main.cpp和test.cpp分別在code/src /和tests/code /中有main):
/tests/src/test.cpp:7: multiple definition of `main'
code/src/main.cpp:6: first defined here
collect2: error: ld returned 1 exit status
有很多重複的在我的Makefile,我很想得到的東西更簡潔是實現建設從這些2個文件夾2個二進制文件的目的,雖然代碼是共享的。
任何幫助,將不勝感激。非常感謝你!
我認爲'code/src/main.cpp'有'main()'。 'tests/src /'中源文件的名稱也是'main()'? – Beta
你說得對,main.cpp有一個main()。它在test/src /中包含另一個main()。謝謝! – Jary