使用 CMake 使用 Network 构建 Qt 项目会导致未定义的引用

Posted

技术标签:

【中文标题】使用 CMake 使用 Network 构建 Qt 项目会导致未定义的引用【英文标题】:Building Qt project with Network using CMake causes undefined references 【发布时间】:2020-08-07 10:07:53 【问题描述】:

我正在使用 Network 包(特别是 QTcpSocket)开发一个 Qt 项目。我可以使用 qmake 轻松编译它,但我无法使用 cmake(我需要交叉编译)来编译它,因为一些关于 Network 包的未定义引用。

我的 CmakeLists 包含以下几行(其中 ... 是其他内容的占位符):

find_package(Qt5 COMPONENTS Network REQUIRED)
qt5_use_modules(... Network ...)
target_link_libraries(... Qt5::Network ...)

我认为这些都是必需的,但显然不是。

链接时我得到的未定义参考错误是一个巨大的列表,所以我只会显示一个小的豁免,除非有人需要更多:

/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qsslsocket_openssl.o):qsslsocket_openssl.cpp:(.text+0x139c): undefined reference to `__imp_CertCreateCertificateContext'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qsslsocket_openssl.o):qsslsocket_openssl.cpp:(.text+0x1441): undefined reference to `__imp_CertGetCertificateChain'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qsslsocket_openssl.o):qsslsocket_openssl.cpp:(.text+0x14c2): undefined reference to `__imp_CertFreeCertificateChain'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qsslsocket_openssl.o):qsslsocket_openssl.cpp:(.text+0x14cb): undefined reference to `__imp_CertFreeCertificateContext'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x15): undefined reference to `ConvertInterfaceNameToLuidW'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x2e): undefined reference to `ConvertInterfaceLuidToIndex'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x5b): undefined reference to `ConvertInterfaceIndexToLuid'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x75): undefined reference to `ConvertInterfaceLuidToNameW'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0xec): undefined reference to `GetNetworkParams'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x1cd): undefined reference to `GetNetworkParams'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x243): undefined reference to `GetAdaptersAddresses'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x3c4): undefined reference to `ConvertInterfaceLuidToNameW'
/opt/mxe/usr/x86_64-w64-mingw32.static/qt5/lib/libQt5Network.a(qnetworkinterface_win.o):qnetworkinterface_win.cpp:(.text+0x91e): undefined reference to `GetAdaptersAddresses'

我错过了什么?还有其他一些我必须添加的模块吗?这个问题是否与我使用 MXE 进行交叉编译有关(我暂时没有这样标记)?

到目前为止,我找到了 MXE - Undefined reference to Qt when cross compiling with cmake and mingw,这使得 MXE 似乎是问题所在,但没有得到答复。

【问题讨论】:

你确定Qt5::Network 是正确的吗?不是Qt5Network @G.M. doc.qt.io/qt-5/qtnetwork-index.html 在 cmake 示例中至少使用了Qt5::Network 一个重要提示,除非您的 CMake 版本早于 2.8.11,否则您的shouldn't need to useqt5_use_modules 命令。考虑删除它。 @Aziuth 您是否在项目中包含了 Network 模块的目录?就像那个 include_directories(Qt5Network_INCLUDE_DIRS)。你可以在find_package(...)之后做 @MaximSkvortsov 还没做,试试看,谢谢建议。 【参考方案1】:

Qt 的 cmake 模块的依赖一定是搞砸了。您可以手动与 Iphlpapi 链接。将target_link_libraries(... Iphlpapi) 添加到 CMakeFile.txt 并再次尝试链接。您可以通过谷歌搜索符号的名称轻松找到必要的库。这将打开相关的 MSDN 页面。当您滚动到底部时,您会看到需要链接哪个库文件才能使该 API 可用于您的程序。

当库被 Qt 的 cmake 模块正确引用时,显式链接指令将是无操作的。您还可以使此链接以目标为 Windows 为条件:

if (WIN32)
    target_link_libraries (mytarget Iphlpapi)
endif ()

【讨论】:

以上是关于使用 CMake 使用 Network 构建 Qt 项目会导致未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

使用CMake构建Qt程序

使用 cmake (windows) 构建时不显示 Qt 资源

使用 Cmake 文件在 Visual Studio 中构建 Qt 项目时出现链接错误

使用Visual Studio + CMake 构建Qt程序弹出Console控制台

Qt 和 CMake 集成

在将 Qt 与 cmake 结合使用时解决链接错误