Qt包括来自不同项目的库

时间:2015-05-05 07:02:47

标签: c++ qt

我有一个基本的Qt项目(A)。

我想包含其他项目(B),因此我将include ($PATH_TO_B_PROJECT/defaults.pri)放入A项目的.pro文件中。

$ PATH_TO_B_PROJECT是硬编码的相对路径。

如果我将项目B中的任何.h包含到项目A中,则没有错误,但是如果我想使用包含的库中的类,我会收到错误:对ClassToBeUsed的未定义引用

我该如何解决?谢谢!

3 个答案:

答案 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项目。