2011-04-30 2 views
3

내 C++ 파일의 종속성을 생성하는 makefile로 시작했습니다. 그것은 구글 테스트를 사용하는 C++ 프로젝트였습니다. 나중에 qmake를 사용하는 Qt 프로젝트를 시작했고 오래된 makefile이 빌드하는 공유 라이브러리에 대한 링크를 사용했다. 말할 필요도없이, 오래된 메이크 파일은 현재 매우 복잡합니다.qmake 파일을 Google 테스트 및 공유 라이브러리와 함께 사용하는 방법

다음 작업을 수행 할 수있는 qmake를 파일하고 싶습니다 :

  • 선택적 (A 소스 목록
  • 빌드 구글 테스트를 공유 라이브러리 구축을,이에 대한 별도의 메이크 파일을 받아 들일 것)
  • 모든 디버그를 다른 디렉토리에있는 것이다 출력 버전을 해제해야 빌드 최초의 공유 라이브러리에 링크 소스의 다른 목록 내 Qt는 실행 파일을 빌드

누군가가 저를 할 수있는 * .pro 파일을 만들기 위해 올바른 방향으로 나를 가리킬 수 있습니까? qmake에서 여러 대상과 같은 작업을 수행하는 방법에 대해서는 분명하지 않습니다. 여기

은 내가 사용하고있는 현재의 메이크 (명확하게 엉망)입니다 :

GTEST_DIR = /home/matt/lib/gtest-1.5.0 
GMOCK_DIR = /home/matt/lib/gmock-1.5.0 
SRC_DIR = /home/matt/Documents/myproject 

QTINC := -I/usr/share/qt4/mkspecs/linux-g++ -I/usr/include/qt4/QtCore \ 
    -I/usr/include/qt4/QtGui -I/usr/include/qt4 

TEST_SRCS = test/TestRunner.cpp test/CellTest.cpp test/PuzzleTest.cpp \ 
    test/SingleCandidateMethodTest.cpp test/ExclusionMethodTest.cpp \ 
    test/BlockIntersectionMethodTest.cpp test/CoveringSetMethodTest.cpp \ 
    test/SimpleValidatorTest.cpp test/PuzzleMarkerTest.cpp \ 
    test/PlayerValidatorTest.cpp test/SolverHelperTest.cpp \ 
    test/GuessCommandTest.cpp test/MarkCommandTest.cpp \ 
    test/UnmarkCommandTest.cpp test/MethodSolverTest.cpp \ 
    test/SimplePuzzleImporterTest.cpp test/SolvedPuzzleImporterTest.cpp \ 
    test/AddHintMarksCommandTest.cpp test/CellControllerTest.cpp \ 
    test/PuzzleControllerTest.cpp 
QT_SRCS = 
LIB_SRCS = Puzzle.cpp Cell.cpp SingleCandidateMethod.cpp ExclusionMethod.cpp \ 
    BlockIntersectionMethod.cpp CoveringSetMethod.cpp SimpleValidator.cpp \ 
    PuzzleMarker.cpp PlayerValidator.cpp SolverHelper.cpp GuessCommand.cpp \ 
    MarkCommand.cpp UnmarkCommand.cpp MethodSolver.cpp \ 
    SimplePuzzleImporter.cpp SolvedPuzzleImporter.cpp GameManager.cpp \ 
    CellController.cpp AddHintMarksCommand.cpp GameController.cpp \ 
    PuzzleController.cpp 

DEPDIR = .deps 
df = $(DEPDIR)/$(@F) 

# preprocessor 
CPPFLAGS += -I$(GTEST_DIR)/include -I$(GMOCK_DIR)/include -I$(SRC_DIR) $(QTINC) 

# C++ compiler 
CXXFLAGS = -Wall -std=c++0x 
# qt defines 
QTDEF = -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED 
# stuff to link for Qt 
QTFLAGS = -L/usr/lib -lQtCore -lQtGui -lpthread 

# gtest headers, don't need to change 
GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \ 
       $(GTEST_DIR)/include/gtest/internal/*.h 
# gmock stuff, don't need to change 
GMOCK_HEADERS = $(GMOCK_DIR)/include/gmock/*.h \ 
       $(GMOCK_DIR)/include/gmock/internal/*.h \ 
       $(GTEST_HEADERS) 

MAKEDEPEND = $(CXX) $(CPPFLAGS) -MM -o $(df).d $< 
MAKEDEPEND_TEST = $(CXX) $(CPPFLAGS) -MM -o $(df).d -MT $(basename $<).o $< 
MAKEDEPEND_QT = $(CXX) $(CPPFLAGS) -MM -o $(df).d -MT $(basename $<).o $< 

SRCS := main.cpp $(LIB_SRCS) 
OBJS := $(SRCS:%.cpp=%.o) 
LIB_OBJS := $(LIB_SRCS:%.cpp=%.o) 
QT_OBJS := $(QT_SRCS:%.cpp=%.o) 
TEST_OBJS := $(TEST_SRCS:%.cpp=%.o) 

# targets: 
debug : CXXFLAGS += -g -O0 
# removed this warning because it sucks: -Wconversion (int to size_t!) 
debug_warn : CXXFLAGS += -pedantic -Wextra 
debug_warn : debug 
debug : all 
release : CXXFLAGS += -O2 
release : all 

lib : CXXFLAGS += -fPIC 
lib : libSudokuLib.so 

libSudokuLib.so : $(LIB_OBJS) 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -shared -o libSudokuLib.so $(LIB_OBJS) 

all : sudoku run_tests 

sudoku : $(OBJS) $(QT_OBJS) 
    $(CXX) $(CPPFLAGS) $(QTDEF) $(CXXFLAGS) $(QTFLAGS) $^ -o [email protected] 

run_tests : $(LIB_OBJS) $(TEST_OBJS) gtest.a gmock.a 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o [email protected] 

# dependency stuff 
.D_TARGET: 
    mkdir -p $(DEPDIR) 
    touch [email protected] 

.PRECIOUS: .D_TARGET 

# GTEST building stuff don't touch me 
GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS) 
GMOCK_SRCS_ = $(GMOCK_DIR)/src/*.cc $(GMOCK_HEADERS) 

gtest-all.o : $(GTEST_SRCS_) 
    $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) -c \ 
      $(GTEST_DIR)/src/gtest-all.cc 

gmock-all.o : $(GMOCK_SRCS_) 
    $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \ 
      -c $(GMOCK_DIR)/src/gmock-all.cc 

gmock_main.o : $(GMOCK_SRCS_) 
    $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \ 
      -c $(GMOCK_DIR)/src/gmock_main.cc 

gmock.a : gmock-all.o gtest-all.o 
    $(AR) $(ARFLAGS) [email protected] $^ 

gtest_main.o : $(GTEST_SRCS_) 
    $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \ 
      $(GTEST_DIR)/src/gtest_main.cc 

gtest.a : gtest-all.o 
    $(AR) $(ARFLAGS) [email protected] $^ 

gtest_main.a : gtest-all.o gtest_main.o 
    $(AR) $(ARFLAGS) [email protected] $^ 

# QT stuff 
%Qt.o : %Qt.o .D_TARGET 
    $(MAKEDEPEND_QT); 
    @cp $(df).d $(df).P; 
# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
#  -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; 
    @rm -f $(df).d 
    $(CXX) $(CPPFLAGS) $(QTDEF) $(CXXFLAGS) -o [email protected] -c $< 

# tests 
%Test.o : %Test.cpp .D_TARGET $(GMOCK_HEADERS) 
    $(MAKEDEPEND_TEST); 
    @cp $(df).d $(df).P; 
# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
#  -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; 
    @rm -f $(df).d 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o [email protected] -c $< 

# objects from sources 
%.o : %.cpp .D_TARGET 
    $(MAKEDEPEND); 
    @cp $(df).d $(df).P; \ 
# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
#  -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; 
    @rm -f $(df).d 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o [email protected] -c $< 

-include $(QT_SRCS:%.cpp=$(DEPDIR)/%.o.P) 
-include $(TEST_SRCS:test/%.cpp=$(DEPDIR)/%.o.P) 
-include $(SRCS:%.cpp=$(DEPDIR)/%.o.P) 

clean: 
    $(RM) $(OBJS) $(TEST_OBJS) $(QT_OBJS) \ 
     gtest.a gtest_main.a gtest-all.o gtest_main.o \ 
     .D_TARGET sudoku run_tests 
    rm -rf $(DEPDIR) 

그리고 여기

(라이브러리 자체를 구축하는 대신 첫 번째 메이크에 의존) qmake에 대한 project.pro 파일입니다
TEMPLATE = app 
TARGET = qtsudoku 
DEPENDPATH += . 
INCLUDEPATH += . ../myproject 
CONFIG += qt warn_on debug 
QMAKE_CXXFLAGS += -std=c++0x 
LIBS += -L/home/matt/Documents/myproject -lSudokuLib 

# Input 
HEADERS += QtPuzzleModel.h QtPuzzleView.h QtGameApplication.h QtDirector.h \ 
    QtMainWindow.h QtFactory.h 
SOURCES += main.cpp QtPuzzleModel.cpp QtGameApplication.cpp QtDirector.cpp \ 
    QtMainWindow.cpp QtFactory.cpp 
+0

재미 있을지 모르겠지만 나는'qmake' 대신'cmake'를 사용하는 것이 훨씬 쉽고 읽기 쉽다고 생각합니다. 특히'cmake'의 최근 업데이트로 인해 그러한 프로젝트를 설치하는 데 문자 그대로 초가 걸립니다. – rbaleksandar

답변

2

일반적으로 이와 같은 작업을 수행하는 좋은 방법은 SUBDIRS qmake 템플릿을 사용하는 것입니다. 빌드하려는 각 항목 (공유 라이브러리, Google 테스트 및 실행 파일)에 대해 qmake 파일을 만든 다음 SUBDIRS 템플릿을 만들어 순서대로 수행합니다. subdirs 템플릿은 각 기본 make 파일에 디버그/릴리스 플래그를 제공 할 것이라고 생각합니다.

공유 라이브러리의 경우 qmake library template이 좋을 것입니다.

Google 테스트에 대해 잘 모르겠다면 원하는 경우 qmake 파일을 생성 할 수 있다고 가정합니다. 그렇지 않으면 makefile을 계속 사용할 수 있습니다.

둘을 연결하는 경우 main.cpp가있는 qmake 파일을 만들고 라이브러리로 다른 파일을 지정하고 builds an executable을 만들 수 있습니다.

DESTDIR, MOC_DIR, OBJECTS_DIRUI_DIR을 사용하여 생성 된 파일의 위치를 ​​변경할 수 있습니다.

관련 문제