首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Pcap++包括在CMake项目中

将Pcap++包括在CMake项目中
EN

Stack Overflow用户
提问于 2022-10-10 12:47:14
回答 1查看 68关注 0票数 0

我正在构建一个Qt应用程序(使用CMake),它将捕获和分析一些网络数据包。由于我在整个项目中都在使用C++,所以在我的应用程序中使用Pcap++是很方便的,而不是使用lib提供的更低层次的C API,比如libpcap或winpcap。

但是,我发现在我的Pcap++中很难使用预构建的CMakeLists.txt库,因为没有提供太多关于这种集成的信息。

这个应用程序应该是跨平台的,我首先在windows上集成了Pcap++。所以我下载了预构建的pcapplusplus-22.05-windows-mingw32-gcc-9.2.0.然后尝试遵循自述的指令,并将它们应用到我的CMake文件中。

我在这里发布了CMakeLists的相关部分,以展示我如何尝试这样做:

代码语言:javascript
复制
set(THIRD_PARTY_LIBS "")
set(THIRD_PARTY_INCLUDES "")

# Add Pcap++ headers
list(APPEND THIRD_PARTY_INCLUDES ${CMAKE_CURRENT_LIST_DIR}/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/header)

# Pcap++ libs and dependencies according to their README
list(APPEND THIRD_PARTY_LIBS pthread ws2_32 iphlpapi)
list(APPEND THIRD_PARTY_LIBS ${CMAKE_CURRENT_LIST_DIR}/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/Common++.lib)
list(APPEND THIRD_PARTY_LIBS ${CMAKE_CURRENT_LIST_DIR}/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/Packet++.lib)
list(APPEND THIRD_PARTY_LIBS ${CMAKE_CURRENT_LIST_DIR}/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/Pcap++.lib)

# Add WinPcap libs
list(APPEND THIRD_PARTY_LIBS ${CMAKE_CURRENT_LIST_DIR}/WpdPack/Lib/Packet.lib ${CMAKE_CURRENT_LIST_DIR}/WpdPack/Lib/wpcap.lib)

# Add includes to project
include_directories(${THIRD_PARTY_INCLUDES})

# Add libs to project
target_link_libraries(${PROJECT_NAME} PRIVATE ${THIRD_PARTY_LIBS} Qt${QT_VERSION_MAJOR}::Core)

相对位置很好。然而,当应用程序链接时,会发生以下错误:

代码语言:javascript
复制
cmd.exe /C "cd . && C:\Qt\Tools\mingw1120_64\bin\c++.exe -g -mwindows CMakeFiles/MyProjectName.dir/MyProjectName_autogen/mocs_compilation.cpp.obj CMakeFiles/MyProjectName.dir/src/core/AppLogger.cpp.obj CMakeFiles/MyProjectName.dir/src/main.cpp.obj CMakeFiles/MyProjectName.dir/src/utils/utils.cpp.obj CMakeFiles/MyProjectName.dir/ui/mainwindow.cpp.obj CMakeFiles/MyProjectName.dir/res/win.rc.obj CMakeFiles/MyProjectName.dir/MyProjectName_autogen/PNK5WDWK6L/qrc_resources.cpp.obj -o MyProjectName.exe -Wl,--out-implib,libMyProjectName.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -L<proj_loc>/src/core   -L<proj_loc>/src/utils   -L<proj_loc>/ui thirdparty/spdlog/libspdlogd.a  ../../thirdparty/WpdPack/Lib/Packet.lib  ../../thirdparty/WpdPack/Lib/wpcap.lib  -lpthread  -lws2_32  -liphlpapi  ../../thirdparty/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/Common++.lib  ../../thirdparty/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/Packet++.lib  ../../thirdparty/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/Pcap++.lib  C:/Qt/6.3.1/mingw_64/lib/libQt6Network.a  C:/Qt/6.3.1/mingw_64/lib/libQt6Widgets.a  -lws2_32  C:/Qt/6.3.1/mingw_64/lib/libQt6Gui.a  C:/Qt/6.3.1/mingw_64/lib/libQt6Core.a  -lmpr  -luserenv  -lmingw32  C:/Qt/6.3.1/mingw_64/lib/libQt6EntryPoint.a  -lshell32  -ld3d11  -ldxgi  -ldxguid  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."

C:/Qt/Tools/mingw1120_64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/MyProjectName.dir/ui/mainwindow.cpp.obj:<proj_loc>/thirdparty/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/header/pcappp/PcapLiveDeviceList.h:47: undefined reference to `pcpp::PcapLiveDeviceList::~PcapLiveDeviceList()'

C:/Qt/Tools/mingw1120_64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/MyProjectName.dir/ui/mainwindow.cpp.obj: in function `MainWindow::on_pushButton_StartRecording_clicked()':

<proj_loc>/ui/mainwindow.cpp:36: undefined reference to `pcpp::PcapLiveDeviceList::getPcapLiveDeviceByIp(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'

C:/Qt/Tools/mingw1120_64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/MyProjectName.dir/ui/mainwindow.cpp.obj: in function `pcpp::PcapLiveDeviceList::getInstance()':

<proj_loc>/thirdparty/pcapplusplus-22.05-windows-mingw32-gcc-9.2.0/header/pcappp/PcapLiveDeviceList.h:47: undefined reference to `pcpp::PcapLiveDeviceList::PcapLiveDeviceList()'

collect2.exe: error: ld returned 1 exit status

在我的应用程序中,我执行这个简单的函数,通过它的IP地址获得一个网络适配器:

代码语言:javascript
复制
this->dev = = pcpp::PcapLiveDeviceList::getInstance().getPcapLiveDeviceByIp("1.2.3.4")

看到“未定义的引用”,我觉得我的唇语没有被恰当地包括在内。我该怎么做呢?

稍后编辑:,看起来我的应用程序是64位,但是库是32位编译的。这可能是我的问题。然而,我想知道为什么没有可见的警告来表明这一点。

EN

回答 1

Stack Overflow用户

发布于 2022-10-12 11:29:30

在他们的网站上,明确表示他们不支持MinGW 64位编译:

“请注意,x64编译在MinGW32或MinGW-W64上都不支持(也不起作用)!”

因此,无法将其链接到使用MinGW的64位应用程序中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74015220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档