使用带有链接静态库的cmake编译dpdk应用程序



我指的是DPDK示例makefile,用于通过CMake编译DPDK应用程序。正确的编译命令应该看起来像

/usr/bin/x86_64-redhat-linux-gcc-8  -I/usr/local/include -include rte_config.h -march=native -mno-avx512f -g CMakeFiles/dpdk_test.dir/main.c.o -o dpdk_test  -Wl,-Bstatic -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs -Wl,--whole-archive -lrte_bus_pci -lrte_pmd_vmxnet3 -Wl,--no-whole-archive -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs -Wl,-Bdynamic -lpthread -ldl -lnuma

这是我的CMakeLists.txt的一部分:

#DPDK_INFRA some DPDK base libs
#DPDK_DRIVER some DPDK driver libs
SET(DPDK_LIBS -Wl,-Bstatic ${DPDK_INFRA} -Wl,--whole-archive ${DPDK_DRIVER} -Wl,--no-whole-archive ${DPDK_INFRA} -Wl,-Bdynamic)
target_link_libraries(${PROJECT_NAME}  ${DPDK_LIBS} pthread numa dl)

DPDK_DRIVER在-Bdynamic之后再次生成,使应用程序死机。若我删除它们并重新编译,它将正常工作并得到正确的结果。

/usr/bin/x86_64-redhat-linux-gcc-8  -I/usr/local/include -include rte_config.h -march=native -mno-avx512f -g CMakeFiles/dpdk_test.dir/main.c.o -o dpdk_test  -Wl,-Bstatic -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs -Wl,--whole-archive -lrte_bus_pci -lrte_pmd_vmxnet3 -Wl,--no-whole-archive -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs -Wl,-Bdynamic -lpthread -lnuma -ldl **-lrte_bus_pci -lrte_pmd_vmxnet3** -lpthread -lnuma -ldl

我希望你的答案

对于pkg-config的结果,DPDK 20.11.1 LTS存在已知错误。由于没有提到DPDK版本,我不得不假设您使用的是更高版本(>20.11(

我能够在CMAKE的第三方项目中成功编译和使用DPDK库,通过将其更改为

  • 在父文件夹中
+find_package(PkgConfig REQUIRED)
+
+if (PKG_CONFIG_FOUND)
+       pkg_check_modules(DPDK "libdpdk")
+       if (DPDK_FOUND)
+               message(STATUS "found dpdk via pkg-config")
+       endif()
+endif()
  • 源文件夹
+pkg_check_modules(DPDK "libdpdk")
+if (DPDK_FOUND)
+  add_definitions(${DPDK_CFLAGS})
+  set(MYDPDK_LIBRARIES -Wl,--whole-archive ${DPDK_LIBRARIES} -lpthread -lnuma -ldl -Wl,--no-whole-archive)
+  include_directories(${DPDK_INCLUDE_DIR})
+  link_libraries(${MYDPDK_LIBRARIES})
+  add_definitions(-DHAVE_DPDK)
+endif(DPDK_FOUND)

[EDIT-1]基于评论建议

  • 在父文件夹中
+find_package(PkgConfig REQUIRED)
+
+if (PKG_CONFIG_FOUND)
+       pkg_check_modules(DPDK "libdpdk")
+       if (DPDK_FOUND)
+               message(STATUS "found dpdk via pkg-config")
+       endif()
+endif()
  • 源文件夹
+pkg_check_modules(DPDK "libdpdk")
+if (DPDK_FOUND)
+  add_definitions(${DPDK_STATIC_CFLAGS})
+  set(MYDPDK_LIBRARIES ${DPDK_STATIC_LDFLAGS})
+  include_directories(${DPDK_INCLUDE_DIR})
+  link_libraries(${MYDPDK_LIBRARIES})
+  add_definitions(-DHAVE_DPDK)
+endif(DPDK_FOUND)

注意:一旦pkg_check_modules找到libdpdk;静态库和cflag可以通过CCD_ 3和CCD_。

最新更新