当前位置: 首页 > 知识库问答 >
问题:

链接外部DPVS应用程序(使用Makefile)与使用Meson构建的DPDK

华景同
2023-03-14

DPVS建议使用dpdk-stable-18.11。2用于生成Makefile。但是当前的DPDK LTS版本是18.11。11支持介子忍者构建系统和Makefile系统。

我一直在试验将代码移植到更新的DPDK版本,该版本只支持介子忍者,而不支持不推荐的Makefile系统。我的问题DPVS链接的问题是,我无法解决依赖性问题时,对DPDK是建立使用介子忍者链接。当我尝试链接到使用Makefiles构建的DPDK 18.11时,同样的方法不会出现问题。我正在使用KVM-QEMU运行具有NIC Virtio/E1000的来宾操作系统。来宾操作系统是Ubuntu 18.04 LTS(x64)。

DPDK库由DPDK的DPVS项目链接。mk和当前链接选项为:

LIBS += -Wl,--no-as-needed -fvisibility=default \
        -Wl,--whole-archive -lrte_pmd_vmxnet3_uio -lrte_pmd_i40e -lrte_pmd_ixgbe \
        -lrte_pmd_e1000 -lrte_pmd_bnxt -lrte_pmd_ring -lrte_pmd_bond -lrte_ethdev -lrte_ip_frag \
        -Wl,--whole-archive -lrte_hash -lrte_kvargs -Wl,-lrte_mbuf -lrte_eal \
        -Wl,-lrte_mempool -lrte_ring -lrte_cmdline -lrte_cfgfile -lrte_kni \
        -lrte_mempool_ring -lrte_timer -lrte_net -Wl,-lrte_pmd_virtio \
        -lrte_pci -lrte_bus_pci -lrte_bus_vdev -lrte_lpm -lrte_pdump \
        -Wl,--no-whole-archive -lrt -lm -ldl -lcrypto

到目前为止我所尝试的:

  • 已验证使用Makefile system链接成功

因此,请帮助解决此链接问题(这似乎是与-Wl标志选项链接相关的一般问题)。

谢谢!:)

编辑:更新的错误日志

cc -D DPVS_MAX_SOCKET=1 -D DPVS_MAX_LCORE=3 -D CONFIG_DPVS_TRACING \
-D CONFIG_DPVS_NEIGH_DEBUG -D CONFIG_DPVS_IPVS_DEBUG -D DPVS_CFG_PARSER_DEBUG \
-D CONFIG_DPVS_IP_HEADER_DEBUG -D CONFIG_DPVS_PDUMP \
-D CONFIG_DPVS_IPSET_DEBUG -D CONFIG_MSG_DEBUG \
-include /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/include/rte_config.h -march=native \
-DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 \
-DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 \
-DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2  \
-D __DPVS__ -DDPVS_VERSION=\"1.8-4\" \
-DDPVS_BUILD_DATE=\"2021.01.25.10:11:27\" \
-Werror -Wstrict-prototypes -Wmissing-prototypes \
-mcmodel=medium -fgnu89-inline -Wno-format-truncation \
-Wno-stringop-truncation -Wstringop-overflow=0 -g -O0 \
-D DEBUG -rdynamic \
-I /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/include \
-I /home/anshul/loadbalancer/dpvs/src//../include \
-L /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib \
-L /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib/x86_64-linux-gnu/ \
-L /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib/x86_64-linux-gnu/dpdk/pmds-18.11 \
-Wl,--no-as-needed -fvisibility=default \
-Wl,--whole-archive -lrte_pmd_vmxnet3 -lrte_pmd_i40e -lrte_pmd_ixgbe -lrte_pmd_e1000 -lrte_pmd_bnxt -lrte_pmd_ring -lrte_pmd_bond -lrte_ethdev -lrte_ip_frag \
-Wl,--whole-archive -lrte_hash -lrte_kvargs \
-Wl,-lrte_mbuf -lrte_eal \
-Wl,-lrte_mempool -lrte_ring -lrte_cmdline -lrte_cfgfile -lrte_kni -lrte_mempool_ring -lrte_timer -lrte_net \
-Wl,-lrte_pmd_virtio -lrte_pci -lrte_bus_pci -lrte_bus_vdev -lrte_lpm -lrte_pdump \
-Wl,--no-whole-archive -lrt -lm -ldl -lcrypto \
-Wl,-rpath,/home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib/x86_64-linux-gnu/ -lpthread -lnuma /home/anshul/loadbalancer/dpvs/src/cfgfile.o ... -o dpvs
/home/anshul/loadbalancer/dpvs/src/netif.o: In function `get_bond_status':
/home/anshul/loadbalancer/dpvs/src/netif.c:4738: undefined reference to `rte_eth_bond_link_monitoring_get'
/home/anshul/loadbalancer/dpvs/src/netif.c:4739: undefined reference to `rte_eth_bond_link_down_prop_delay_get'
/home/anshul/loadbalancer/dpvs/src/netif.c:4740: undefined reference to `rte_eth_bond_link_up_prop_delay_get'
/home/anshul/loadbalancer/dpvs/src/netif.o: In function `set_bond':
/home/anshul/loadbalancer/dpvs/src/netif.c:5030: undefined reference to `rte_eth_bond_link_down_prop_delay_set'
/home/anshul/loadbalancer/dpvs/src/netif.c:5039: undefined reference to `rte_eth_bond_link_up_prop_delay_set'
collect2: error: ld returned 1 exit status
Makefile:71: recipe for target 'dpvs' failed
make[1]: *** [dpvs] Error 1
make[1]: Leaving directory '/home/anshul/loadbalancer/dpvs/src'
Makefile:33: recipe for target 'all' failed
make: *** [all] Error 1

更新:dpdk中当前使用的选项。mk是:

CFLAGS += -march=native \
          -DRTE_MACHINE_CPUFLAG_SSE \
          -DRTE_MACHINE_CPUFLAG_SSE2 \
          -DRTE_MACHINE_CPUFLAG_SSE3 \
          -DRTE_MACHINE_CPUFLAG_SSSE3 \
          -DRTE_MACHINE_CPUFLAG_SSE4_1 \
          -DRTE_MACHINE_CPUFLAG_SSE4_2 

LIBS += -L $(DPDKDIR)/lib
LIBS += -L $(DPDKDIR)/lib/x86_64-linux-gnu/
LIBS += -L $(DPDKDIR)/lib/x86_64-linux-gnu/dpdk/pmds-20.11
 
LIBS += -Wl,--no-as-needed -fvisibility=default \
        -Wl,--whole-archive -lrte_net_vmxnet3 -lrte_net_i40e -lrte_net_ixgbe \
        -lrte_net_e1000 -lrte_net_bnxt -lrte_net_ring -lrte_ip_frag \
        -Wl,--whole-archive -lrte_hash -lrte_kvargs -Wl,-lrte_mbuf -lrte_eal \
        -Wl,--whole-archive -l:librte_net_bond.a -l:librte_ethdev.a \
        -Wl,-lrte_mempool -lrte_ring -lrte_cmdline -lrte_cfgfile -lrte_kni \
        -lrte_mempool_ring -lrte_timer -lrte_net -Wl,-lrte_net_virtio \
        -lrte_pci -lrte_bus_pci -lrte_bus_vdev -lrte_lpm -lrte_pdump \
        -Wl,--no-whole-archive -lrt -lm -ldl -lcrypto -lrte_telemetry

LIBS += -Wl,-rpath,$(DPDKDIR)/lib/x86_64-linux-gnu/

总结:

  • CFLAGS中删除-DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE、RTE_CPUFLAG_SSE3、RTE_CPUFLAG_SSSE3、RTE_CPUFLAG_SSE4_1、RTE_CPUFLAG_SSE4_2,以避免重新定义错误
  • 更新了LIBS变量中的库路径,以反映指向SDK的路径。SDK文件夹(DPDKDIR)是ninja install将文件和库安装到的文件
  • 添加了-Wl,-rpath,$(DPDKDIR)/lib/x86_64-linux-gnu/选项,用于参考某些库的零散问题*。所以11
  • 使用-l:librte\u net\u-bond链接到静态库进行绑定和ethdev。a-l:librte_ethdev。a选项

共有1个答案

麻宜春
2023-03-14

您面临的问题是由于不正确使用库链接造成的。最简单的解决办法是

  1. 下载DPDK 18.11。11个支持介子的LTS

第3.24节已安装DPDK的内置点火应用程序简要介绍了这些步骤

[EDIT-1]注意:由于@Anshul对Makefile所做的更改没有更新,因此我创建了一个推送请求来支持相同的更改。

src/Makefile的diff

index 02f288c..f2aefdb 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -34,10 +34,14 @@ DATE_STRING := $(shell date +%Y.%m.%d.%H:%M:%S)
 # same path of THIS Makefile
 SRCDIR := $(dir $(realpath $(firstword $(MAKEFILE_LIST))))

+ifeq ($(shell pkg-config --exists libdpdk && echo 0),0)
+else
 ifeq ($(RTE_SDK),)
        $(error "The variable RTE_SDK is not defined.")
 endif
 include $(RTE_SDK)/mk/rte.vars.mk
+LIBS += -lpthread -lnuma
+endif

 include $(SRCDIR)/config.mk
 include $(SRCDIR)/dpdk.mk
@@ -62,7 +66,6 @@ else
        CFLAGS += -rdynamic
 endif

-LIBS += -lpthread -lnuma

src/dpdk的差异。mk

 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
+ifeq ($(shell pkg-config --exists libdpdk && echo 0),0)
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API -static $(shell pkg-config --cflags libdpdk)
+LIBS += $(shell pkg-config --libs --static libdpdk)
+
+else

 ifeq ($(RTE_SDK),)
 $(error "The variable RTE_SDK is not defined.")
@@ -58,3 +64,4 @@ LIBS += -Wl,--whole-archive -lrte_pmd_mlx5 -Wl,--no-whole-archive
 LIBS += -libverbs -lmlx5 -lmnl
 endif

+endif
 类似资料:
  • 我遵循了https://blog.jetbrains.com/idea/2013/03/packaging-javafx-2-applications-in-intellij-idea-121/中的步骤 但是当我尝试构建工件时,在最后一步中,我得到了这个错误 错误:Java FX Packager:无法生成工件-FX:Deploy在此JDK中不可用 这里有一个快速测试的hello world应用程

  • 问题内容: 我正在尝试使用Gradle构建相对简单的JavaFX应用程序。但是,我不知道该怎么做。 我是Gradle的新手,对于简单的(非javafx)项目,我已经成功使用了插件,并构建和打包了库和命令行应用程序。 但是,关于JavaFX,我完全陷入困境。我已经阅读了这篇文章,该文章建议使用该插件,但是我只能找到该插件的源代码,但是没有关于如何实际使用它的文档(在文章中,他们只是从远程URL应用它

  • 我试图使用Gradle构建一个相对简单的JavaFX应用程序。但是,我完全不知道该怎么做。 我对Gradle比较陌生,对于简单的(非JavaFX)项目,我已经成功地使用了插件和来构建和打包库和命令行应用程序。 然而,当涉及到JavaFX时,我完全被卡住了。我读过这篇文章,其中建议使用插件,但是我只能找到这个插件的源代码,而没有关于如何实际获取它和使用它的文档(在文章中,他们只是从远程URL应用它,

  • 问题内容: 我正在使用ROS开发用于多机器人系统的GUI,但是我在界面中的最后一件事就是冻结:将RVIZ,GMAPPING或其他屏幕嵌入到我的应用程序中。我已经在界面中放置了一个终端,但是无法绕开如何向我的应用程序添加外部应用程序窗口的问题。我知道PyQt5具有createWindowContainer,它使用窗口ID来停靠外部应用程序,但是我没有找到任何示例来帮助我。 如果可能的话,我想在应用程

  • 问题内容: 我需要制作一个可以用外部jar文件编译和执行我的类的makefile。我有4个类;。 我还需要包括..这是我的制作文件 谢谢 问题答案: 您是指在Linux OS中制作Makefile吗? 检查一下-Makemakefile指南 http://www.cs.swarthmore.edu/~newhall/unixhelp/howto_makefiles.html 或这个-例子 http

  • 在SpringBoot项目中,谁使用maven。找不到类 我绒球的一部分 项目结构 当我启动应用程序时,我得到了这个错误 错误:无法找到或加载主类com.acme.pay.ms.BillingServiceApplication导致:java.lang.ClassNotFoundExc0019:com.acme.pay.ms.BillingServiceApplication命令执行失败。 无法执