如何使用qmake文件与谷歌测试和共享库

How to use qmake file with google test and shared library

本文关键字:测试 共享 谷歌 何使用 qmake 文件      更新时间:2023-10-16

我从一个makefile开始,它将生成c++文件的依赖项。这是一个使用google测试的c++项目。后来,我开始了一个Qt项目,它使用qmake并链接到旧的makefile构建的共享库。不用说,旧的makefile现在真的很复杂。

我想创建一个qmake文件,它可以做以下事情:

  • 为一个源列表构建一个共享库
  • 构建google测试(可选,我会接受一个单独的makefile for this)
  • 用链接到第一个共享库的不同源列表构建我的Qt可执行文件
  • 所有构建都应该有调试和发布版本,它们将输出到不同的目录
谁能告诉我做*的正确方向?专业文件是什么?我真的不清楚如何在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 $@
run_tests : $(LIB_OBJS) $(TEST_OBJS) gtest.a gmock.a
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
# dependency stuff
.D_TARGET:
    mkdir -p $(DEPDIR)
    touch $@
.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) $@ $^
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) $@ $^
gtest_main.a : gtest-all.o gtest_main.o
    $(AR) $(ARFLAGS) $@ $^
# 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 $@ -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 $@ -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 $@ -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的Pro文件(它依赖于第一个makefile而不是构建库本身)

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

一般来说,这样做的一个好方法是使用SUBDIRS qmake模板。您可以为您想要构建的每个项目(共享库、google测试和可执行文件)创建一个qmake文件,然后创建一个SUBDIRS模板来按顺序完成这些工作。我认为subdirs模板将为每个底层make文件提供调试/释放标志。

对于共享库,qmake库模板应该可以。

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

要链接两者,您可以创建一个qmake文件,其中包含main.cpp,将其他文件指定为库,并构建一个可执行文件。

您可以使用DESTDIR, MOC_DIR, OBJECTS_DIR和UI_DIR来更改生成文件的位置