我有一个基本的Qt项目(A)。
我想包含其他项目(B),因此我将include ($PATH_TO_B_PROJECT/defaults.pri)
放入A项目的.pro文件中。
$ PATH_TO_B_PROJECT是硬编码的相对路径。
如果我将项目B中的任何.h包含到项目A中,则没有错误,但是如果我想使用包含的库中的类,我会收到错误:对ClassToBeUsed的未定义引用
我该如何解决?谢谢!
答案 0 :(得分:2)
undefined reference to ClassToBeUsed
表示链接器无法找到ClassToBeUsed
方法的定义(即正文)。解决方案取决于项目B的类型。
如果是它的库,你需要像这样链接它:
LIBS += -lprojectB
如果它只是来源,那么您需要在cpp
文件中添加defaults.pri
个文件:
SOURCES += $$PWD/path_from_pri_to_cpp/ClassToBeUsed.cpp
答案 1 :(得分:2)
我应该提到。您收到此错误消息的原因是您的项目确实包含标题。但是不包含包含实现的.lib文件。请注意,您需要为每个构建包含不同的.lib文件(例如,debug,release等)
嗯,这让我们的团队花了很长时间才发现。我会给你我们的解决方案。我不知道这是官方还是最佳解决方案。或者,如果在QT中存在这样的事情,那么它就是它的本质。
我们实现它的方式,每个项目都有一个.pro和一个.pri文件。最简单的思考方式。是考虑.pri文件项目“header”和项目实现的配置文件。
所以项目需要的东西,但项目的依赖关系不需要。进入.pro文件。依赖项所需的任何内容都在.pri文件中。毫无疑问,专业文件包含它自己的pri文件。
现在我们的简单.pri文件(includeNetwork.pri)如下所示:
#Network include dirs
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
#include the debug and definitions
!include( $$PWD/../DebugAndDefinitions/includeDebugAndDefinitions.pri ){
error( "includeDirs not included. Filename: $$PWD/../DebugAndDefinitions/includeDebugAndDefinitions.pri" )
}
#include the database
!include( $$PWD/../Database/includeDatabase.pri ){
error( "includeDirs not included. Filename: $$PWD/../Database/includeDatabase.pri" )
}
#Include the libraries, if the project is not the pri's parent
!equals(_PRO_FILE_PWD_, $$PWD) {
CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../Network/release/ -lNetwork
CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../Network/debug/ -lNetwork
CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../Network/release/Network.lib
CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../Network/debug/Network.lib
}
install_config_network_core.path = $$OUT_PWD/config/
install_config_network_core.files = $$_PRO_FILE_PWD_/../Network/config/network.xml
install_config_network_core.extra = $(COPY_FILE) \"$$shell_path($$_PRO_FILE_PWD_/../Network/config/core.xml)\" \"$$OUT_PWD/config/network.xml\"
install_config_network_gui.path = $$OUT_PWD/config/
install_config_network_gui.files = $$_PRO_FILE_PWD_/../Network/config/network.xml
install_config_network_gui.extra = $(COPY_FILE) \"$$shell_path($$_PRO_FILE_PWD_/../Network/config/gui.xml)\" \"$$OUT_PWD/config/network.xml\"
它的.pro文件(读取实现文件)如下所示:
QT -= gui
QT += network
TARGET = Network
TEMPLATE = lib
CONFIG += staticlib
SOURCES += \
NetworkConfigurator.cpp \
UdpHandler.cpp \
IOSSocket.cpp \
IOSServer.cpp \
IOSBeacon.cpp
HEADERS += \
NetworkConfigurator.h \
UdpHandler.h \
IOSSocket.h \
IOSServer.h \
IOSBeacon.h
RESOURCES += \
network.qrc
OTHER_FILES += \
includeNetwork.pri
#include the projects pri file
!include( $$PWD/includeNetwork.pri ){
error( "includeDirs not included. Filename: $$PWD/includeNetwork.pri" )
}
值得一提的是
我们有时会检测哪个项目“脏”并需要编译。导致不完整或不完整的构建。我不知道这个问题应该归咎于什么。
这仅适用于Windows。如果您需要有关Linux或多平台实现的帮助。只是大声喊叫:)
这是为静态库编写的。使用DLL可能需要稍微不同的方法
同样,这只是我们的方法。如果您认为可以做出任何不同或更好的事情,我会很高兴听到它:)
答案 2 :(得分:0)
事实证明这更容易。只需打开这两个项目,而项目A是一个活动项目,转到Projects-> Dependencies->选择B项目。