2011-03-04 3 views
13

현재 메이크 파일을 컴파일하고 상당히 큰 프로젝트를 만들도록 설정했습니다. 테스트를 실행하기위한 주요 기능을 가진 두 번째 cpp 파일을 작성했습니다. 이 파일들을 별도로 실행하기를 원하지만 함께 빌드하고 동일한 파일을 사용합니다. 이것이 어떻게 완성 되었습니까?makefile에서 두 개의 개별 실행 파일 만들기 (g ++)

편집 : 참조로, 여기 내 현재 메이크 파일입니다. 나는 그것을 조정하는 방법을 모르겠습니다.

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 target 또는 make tests 필요한 수 있습니다.

따라서 위 메이크 예를 들어 이런 식으로 뭔가해야 할 수 있습니다에 대한 :

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

나는이 대답이 옳다는 것을 확신하지만, 나는 메이크 파일에 익숙하지 않다. 나는 현재 게시물을 게시했습니다. 두 개의 "SOURCES ="라인 (다른 이름은 분명히 있음)이 있어야합니다. 여기서 1은 main.cpp를 포함하고 하나는 테스트 주를 포함하고, 하나는 주 참조가있는 타겟 참조입니다. 조금 혼란스러워. – socks

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).

CPPFLAGSCXXFLAGS 변수의 값은 target-specific입니다.

관련 문제