has*_*ine 6 c++ qt unit-testing qt-creator include-path
我正在我的 Qt 创建器中创建两个 C++ 项目。第一个是 an Application project,另一个是unit-test project。这两个项目分别运行良好。然而,当将两者联系在一起时,我遇到了一些问题。
我将其包含#INCLUDEPATH applicationProjectPath在. 然后从应用程序项目中。然后,创建一个from并调用该对象内的函数。.pro fileunit-test project#include myClassmain.cppunit-test projectmyObjectmyClass
编译的时候出现这个错误:
undefined reference to `myObject::function' 
但是,当添加#SOURCES applicationProjectPath/myClass.cpp到单元测试项目的 .pro 文件时(同时保留#INCLUDEPATH applicationProjectPath),一切正常(即:测试单元被执行)
#INCLUDEPATH当从 .pro 中删除 时,它再次崩溃。
我想如果我包含了#SOURCES,那么我就不需要包含#INCLUDEPATH. 如果我包含#INCLUDEPATH,我不应该包含#SOURCES(至少不包含完整路径,只是 .cpp 文件,然后编译器应该查找两个目录,默认目录和添加目录)。
所以,我的问题是:为什么会发生这种情况
您的单元测试将需要编译项目中您想要进行单元测试的类。因此,您需要在两个项目中添加包含(否则测试项目将不知道您要测试的类)。并且链接器还需要链接到项目的代码,因为您的测试将使用这些类。
一种方法是在测试项目中添加要测试的类,并在编译单元测试项目时再次编译它们,但这很乏味而且不太方便,因为每次要添加类时,都需要添加它添加到两个 .pro 文件(提示,您可以在 .pro 文件中使用通配符,例如 *.cpp 将文件夹中的所有源文件添加到项目中)。
我认为更好的方法是将要测试的项目设置为静态库,将其与应用程序分离:您有另一个项目,它是一个应用程序,仅包含main.cpp到该静态库的链接。
以下是包含该项目的文件夹的表示:
Project.pro #subdir project
UIProject/ #static lib
    UIProject.pro
    #all your classes here
MainProject/ #application
    MainProject.pro
    main.cpp
UITestProject/ #unit tests of UIProject (linking to it)
    UITestProject.pro
    #all your UI test classes here
项目.pro:
TEMPLATE = subdirs
SUBDIRS += UIProject
SUBDIRS += MainProject
SUBDIRS += UITestProject
UIProject.pro:
# project type
TEMPLATE = lib
# library type
CONFIG += staticlib
HEADERS += *.h
SOURCES += *.cpp
主要项目.pro:
#[...]
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += ../UIProject/
DEPENDPATH += $${INCLUDEPATH} # force rebuild if the headers change
# link against UILib
_UI_LIB = ../UIProject/
CONFIG(debug, debug|release) {
    win32: _UI_LIB = $$join(_UI_LIB,,,debug/UIProject.lib)
} else {
    win32: _UI_LIB = $$join(_UI_LIB,,,release/UIProject.lib)
}
LIBS += $${_UI_LIB}
PRE_TARGETDEPS += $${_UI_LIB}
UITestProject.pro:
#[...]
TEMPLATE = app
HEADERS += *.h
SOURCES += *.cpp
INCLUDEPATH += ../UIProject/
DEPENDPATH += $${INCLUDEPATH} # force rebuild if the headers change
# link against UILib
_UI_LIB = ../UIProject/
CONFIG(debug, debug|release) {
    win32: _UI_LIB = $$join(_UI_LIB,,,debug/UIProject.lib)
} else {
    win32: _UI_LIB = $$join(_UI_LIB,,,release/UIProject.lib)
}
LIBS += $${_UI_LIB}
PRE_TARGETDEPS += $${_UI_LIB}
您必须对其进行编辑以匹配您的项目,但主要内容都在这里。它应该可以像我从我的项目之一复制它一样工作,只要我没有添加任何错误。