在CentOS Stream 8上使用icpx编译链接PcapPlusPlus库与SYCL代码失败的求助
我想在我的SYCL代码中使用C库PcapPlusPlus及其头文件,具体来说是用Intel C编译器(icpx)编译。我会用C、Java和Python编程,但在C++中使用外部库时遇到了问题,始终无法正确编译和链接这个库。我之前第一次接触CMake,也尝试用它来解决问题,但还是没成功,下面详细说说我的操作过程:
我使用的环境是CentOS Stream 8和oneAPI Base Toolkit 2023.1,已经成功测试过不依赖第三方库的代码。
首先我下载了PcapPlusPlus的仓库源码,放到项目文件夹里,然后按照官方安装说明,用CMake搭配我要使用的icpx编译器来构建库:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DCMAKE_INSTALL_PREFIX=/path/to/PcapPlusPlus
接着按照说明完成构建和安装:
cmake --build build cmake --install build
之后我尝试用官方提供的示例代码和CMake文件来编译,这能成功,但没有使用icpx编译器。
于是我转而研究如何直接用icpx命令行来链接库和头文件,了解到可以用-I指定头文件路径,-L指定库路径,-l指定库名。PcapPlusPlus会生成3个静态库,我执行了以下命令:
icpx -I/path/to/installed/PcapPlusPlus/include -L/path/to/installed/PcapPlusPlus/lib -lCommon++ -lPacket++ -lPcap++ mysrc.cpp -o myexe
但这个命令产生了大量指向Packet.h头文件的“undefined reference”错误,最终icpx报错退出:
icpx: error: linker command failed with exit code 1
我还尝试参考PcapPlusPlus示例的CMakeLists.txt和Intel的编译器文档,写了一个使用icpx的CMakeLists.txt文件:
if (CMAKE_HOST_WIN32) # need at least CMake 3.23 for IntelLLVM support of IntelSYCL package on Windows cmake_minimum_required(VERSION 3.23) else() # CMake 3.20.5 is the minimum recommended for IntelLLVM on Linux cmake_minimum_required(VERSION 3.20.5) endif() project(simple-sycl LANGUAGES CXX) set(CMAKE_CXX_COMPILER icpx) # popen()/pclose() are not C++ standards set(CMAKE_CXX_EXTENSIONS ON) find_package(PcapPlusPlus REQUIRED) add_executable("${PROJECT_NAME}" main.cpp) # We want to have the binary compiled in the same folder as the .cpp to be near the PCAP file set_target_properties("${PROJECT_NAME}" PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") # Link with Pcap++ libraries target_link_libraries("${PROJECT_NAME}" PUBLIC PcapPlusPlus::Pcap++)
我删掉了find_package(IntelSYCL REQUIRED),因为这会导致找不到IntelSYCL的错误。
然后执行如下CMake命令:
cmake -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DPcapPlusPlus_ROOT=/path/to/PcapPlusPlus
这个过程在执行find_package(PcapPlusPlus)时出了问题,它生成了一个C文件,icpx当然无法读取。后来我在project()里加上了C,虽然没有报错,但也没有生成二进制文件。我还尝试修改oneAPI的示例CMakeLists.txt并添加查找库的代码,结果也是同样的错误。
现在我陷入了困境,找不到解决这个链接问题的方法,想知道自己哪里做错了,或者是否有可能在SYCL代码中使用这个库?
备注:内容来源于stack exchange,提问作者user23683306

