从makefile创建两个单独的可执行文件(g ++)

时间:2011-03-04 08:39:45

标签: c++ g++ makefile

目前,我已将makefile设置为编译并制作一个相当大的项目。我编写了第二个带有main函数的cpp文件来运行测试。我希望这些单独运行,但是一起构建并且它们使用相同的文件。这是如何完成的?

编辑:作为参考,这是我当前的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 $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

2 个答案:

答案 0 :(得分: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 $@

$(TEST_EXECUTABLE): $(COMMON_OBJECTS) $(TEST_OBJECTS)
    $(CC) $(LDFLAGS) $^ -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

答案 1 :(得分:0)

这是一种方法:

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

all: myprog mytest

myprog.cpp: main.cpp
    cp -vf $< $@
myprog: myprog.o Foo.o Bar.o Test.o A.o B.o C.o

mytest.cpp: main.cpp
    cp -vf $< $@
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)。

另请注意,变量CPPFLAGSCXXFLAGS使用target-specific值。

相关问题