首页 > 解决方案 > 使用 CMake 使用 Network 构建 Qt 项目会导致未定义的引用

问题描述

我正在使用 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 - 使用 cmake 和 mingw 交叉编译时对 Qt 的未定义引用,这使得看起来 MXE 可能是问题所在,但没有得到回答。

标签: c++qtcmake

解决方案


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

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

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

推荐阅读