2011-03-04 96 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

相关问题