其他分享
首页 > 其他分享> > Qt creator:c:对Class :: Function的未定义引用

Qt creator:c:对Class :: Function的未定义引用

作者:互联网

我在我的Qt创建者中创建了两个c项目.第一个是应用程序项目,另一个是单元测试项目.这两个项目分开,工作正常.然而,当把两者连接在一起时,我面临一个小问题.

我在单元测试项目中的.pro文件中包含#INCLUDEPATH applicationProjectPath.然后#include myClass来自单元测试项目的main.cpp中的应用程序项目.然后,从myClass创建一个myObject并调用该对象中的一个函数.

编译时出现此错误:

undefined reference to `myObject::function' 

但是,当将#SOURCES applicationProjectPath / myClass.cpp添加到单元测试项目的.pro文件中时(同时保留#INCLUDEPATH applicationProjectPath),一切正常(即:执行测试单元)

再次从.pro中删除#INCLUDEPATH时,它再次崩溃.

我想如果我包含#SOURCES,那么我不需要包含#INCLUDEPATH.如果我包含#INCLUDEPATH,我不应该包含#SOURCES(至少不包含完整路径,只包含.cpp文件,然后编译器应查找两个目录,默认目录和添加的目录).

所以,我的问题是:为什么会发生这种情况

解决方法:

您的单元测试需要编译项目中要进行单元测试的类.因此,您需要在两个项目中添加include(否则测试项目将不知道您要测试的类).链接器也需要链接到项目的代码,因为您的测试将使用这些类.

一种方法是在测试项目中添加要测试的类,并在编译单元测试项目时再次编译它们,但这很乏味,并且不是很方便,因为每次要添加类时,都需要添加两个.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

Project.pro:

TEMPLATE = subdirs
SUBDIRS += UIProject
SUBDIRS += MainProject
SUBDIRS += UITestProject

UIProject.pro:

# project type
TEMPLATE = lib

# library type
CONFIG += staticlib

HEADERS += *.h
SOURCES += *.cpp

MainProject.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}

您必须编辑它以匹配您的项目,但主要的事情在这里.它应该工作,因为我从我的一个项目复制它,提供我没有添加任何错误.

标签:c,unit-testing,qt,qt-creator,include-path
来源: https://codeday.me/bug/20190825/1721531.html