2011-04-30 52 views
3

我从一个生成文件开始,它会生成我的C++文件的依赖关系。这是一个使用谷歌测试的C++项目。后来,我开始了一个Qt项目,它使用qmake和链接到旧的makefile构建的共享库。不用说,旧的makefile现在非常复杂。如何在谷歌测试和共享库中使用qmake文件

我想作一个qmake的文件,它可以做到以下几点:

  • 建立一个共享库列表的来源
  • 构建谷歌测试(可选,我会接受这个单独的makefile )
  • 建立我的Qt可执行文件的源链接到第一个共享库
  • 所有作品应具有调试和发布版本将输出到不同的目录不同的列表

有人能指出我在正确的方向做出一个* .pro文件,将做到这一点?我真的不清楚如何做像qmake中的多个目标。

这是当前的makefile我使用(明确一团糟):

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

虽然听起来很有趣,但我发现使用'cmake'而不是'qmake'更容易,更易读。特别是最近更新'cmake'需要几秒钟的时间才能建立这样一个项目。 – rbaleksandar 2016-03-07 09:12:30

回答

2

一般来说,做这种事情的一个好方法是使用SUBDIRS qmake模板。您将为每个要构建的项目(共享库,谷歌测试和可执行文件)创建一个qmake文件,然后创建一个SUBDIRS模板来按顺序执行这些项目。我认为subdirs模板会为每个底层make文件提供debug/release标志。

对于共享库,qmake library template应该没问题。

我不知道谷歌测试,我假设你可以生成一个qmake文件,如果需要的话,或者你可以继续makefile。

对于连接两个,你可以做,有一个main.cpp的一个QMAKE文件,指定其他图书馆,和builds an executable

您可以使用DESTDIR,MOC_DIR, OBJECTS_DIRUI_DIR来更改生成文件的位置。