gpt4 book ai didi

c++ - Qt 包含来自不同项目的库

转载 作者:行者123 更新时间:2023-11-30 01:48:45 27 4
gpt4 key购买 nike

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

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

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

如果我将项目 B 中的任何 .h 包含到项目 A 中,则不会出现错误,但是如果我想使用包含的库中的类,则会出现错误:对 ClassToBeUsed 的 undefined reference

我该如何解决?谢谢!

最佳答案

编辑:

我应该提一下。您收到此错误消息的原因是您的项目确实包含 header 。但不包括包含实现的 .lib 文件。请注意,您需要为每个构建(例如调试、发布等)包含一个不同的 .lib 文件

解决方案:

好吧,我们的团队花了很长时间才找到答案。我会给你我们的解决方案。我不知道这是官方的还是最好的解决方案。或者如果 QT 中存在这样的东西,考虑到它的本质。

按照我们的实现方式,每个项目都有一个 .pro 和一个 .pri 文件。想到这些的最简单方法。是考虑 .pri 文件作为项目“标题”和项目实现的配置文件。

所以项目需要但项目的依赖项不需要的任何东西。进入 .pro 文件。依赖项也需要的任何内容都放在 .pri 文件中。不用说,pro 文件包含它自己的 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 可能需要稍微不同的方法

  • 同样,这只是我们的方法。如果有任何您认为可以做得不同或更好的地方,我很乐意听到:)

关于c++ - Qt 包含来自不同项目的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30046239/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com