2011-03-04 107 views
13

目前,我已經設置了makefile來編譯並創建一個相當大的項目。我已經編寫了第二個具有運行測試主函數的cpp文件。我想要這些分開運行,但一起建立,他們使用相同的文件。這是如何完成的?從makefile中創建兩個單獨的可執行文件(g ++)

編輯:作爲參考,這裏是我目前的makefile。我不知道如何調整它。

CC=g++ 
CFLAGS=-c -Wall -DDEBUG -g 
LDFLAGS= 
SOURCES=main.cpp Foo.cpp Bar.cpp Test.cpp A.cpp B.cpp C.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=myprogram 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

回答

17

通常你只會有多個目標,並做這樣的事情:然後可以根據需要

.PHONY: all target tests 

all: target tests 

target: ... 
    ... 

tests: ... 
    ... 

你只是make(默認爲make all),或者只是make targetmake tests

因此,對於你比你的makefile例子可能希望有這樣的事情:

CC = g++ 
CFLAGS = -c -Wall -DDEBUG -g 
LDFLAGS = 
COMMON_SOURCES = Foo.cpp Bar.cpp A.cpp B.cpp C.cpp 
TARGET_SOURCES = main.cpp 
TEST_SOURCES = test_main.cpp 
COMMON_OBJECTS = $(COMMON_SOURCES:.cpp=.o) 
TARGET_OBJECTS = $(TARGET_SOURCES:.cpp=.o) 
TEST_OBJECTS = $(TEST_SOURCES:.cpp=.o) 
EXECUTABLE = myprogram 
TEST_EXECUTABLE = mytestprogram 

.PHONY: all target tests 

all: target tests 

target: $(EXECUTABLE) 

tests: $(TEST_EXECUTABLE) 

$(EXECUTABLE): $(COMMON_OBJECTS) $(TARGET_OBJECTS) 
    $(CC) $(LDFLAGS) $^ -o [email protected] 

$(TEST_EXECUTABLE): $(COMMON_OBJECTS) $(TEST_OBJECTS) 
    $(CC) $(LDFLAGS) $^ -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 
+0

我敢肯定這個答案是正確的,但我對makefiles沒有經驗。我已經在帖子中發佈了我的當前版本。我應該有2個「SOURCES =」行(顯然有不同的名字),其中1包含main.cpp,一個包含測試主體,然後爲主目標引用主體?只是有點困惑。 – socks 2011-03-04 08:58:24

0

下面是做這件事:

CXXFLAGS += -std=c++11 -Wall -O3 

all: myprog mytest 

myprog.cpp: main.cpp 
    cp -vf $< [email protected] 
myprog: myprog.o Foo.o Bar.o Test.o A.o B.o C.o 

mytest.cpp: main.cpp 
    cp -vf $< [email protected] 
mytest.o: CPPFLAGS += -DDEBUG 
mytest.o: CXXFLAGS += -O0 -g 
mytest: mytest.o Foo.o Bar.o Test.o A.o B.o C.o 

這工作,因爲built-in rules存在從C編譯對象++源(%.o: %.cpp)和鏈接主程序(%: %.o)。

還要注意使用target-specific值的變量CPPFLAGSCXXFLAGS

相關問題