我试图使用meson来构建dpdk的helloworld示例,作为一个独立的应用程序。我希望将应用程序静态地链接到dpdk库中。
我已经下载了DPDK22.07到/home/aizrailev/dpdk,并将其安装到/home/aizrailev/dpdk/install (如果dpdk是在系统范围内安装的,那么一切都很好)。然后我转到/home/aizrailev/dpdk/examples/helloworld,尝试使用下面的meson.build构建应用程序(在此之前,我运行export PKG_CONFIG_PATH=/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/pkgconfig):
project('dpdk-app', 'c')
dpdk = dependency('libdpdk', static: true)
sources = files('main.c')
executable('dpdk-app', sources, dependencies: dpdk) 构建应用程序的步骤:
meson build
cd build/
ninja发生下列错误:
[2/2] Linking target dpdk-app
FAILED: dpdk-app
cc -o dpdk-app dpdk-app.p/main.c.o -Wl,--as-needed -Wl,--no-undefined -Wl,--whole-archive
-Wl,--start-group /home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_cpt.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_dpaax.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_iavf.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_octeontx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bus_auxiliary.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bus_dpaa.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bus_fslmc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bus_ifpga.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bus_pci.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bus_vdev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bus_vmbus.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_cnxk.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_mlx5.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_qat.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_common_sfc_efx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool_bucket.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool_cnxk.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool_dpaa.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool_dpaa2.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool_octeontx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool_ring.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool_stack.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dma_cnxk.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dma_dpaa.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dma_dpaa2.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dma_hisilicon.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dma_idxd.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dma_ioat.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dma_skeleton.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_af_packet.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_ark.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_atlantic.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_avp.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_axgbe.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_bnx2x.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_bnxt.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_bond.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_cnxk.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_cxgbe.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_dpaa.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_dpaa2.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_e1000.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_ena.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_enetc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_enetfec.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_enic.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_failsafe.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_fm10k.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_hinic.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_hns3.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_i40e.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_iavf.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_ice.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_igc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_ionic.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_ixgbe.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_kni.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_liquidio.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_memif.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_mlx4.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_mlx5.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_netvsc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_nfp.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_ngbe.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_null.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_octeontx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_octeontx_ep.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_pcap.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_pfe.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_qede.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_ring.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_sfc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_softnic.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_tap.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_thunderx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_txgbe.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_vdev_netvsc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_vhost.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_virtio.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net_vmxnet3.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_raw_cnxk_bphy.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_raw_cnxk_gpio.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_raw_dpaa2_cmdif.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_raw_ntb.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_raw_skeleton.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_bcmfs.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_caam_jr.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_ccp.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_cnxk.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_dpaa_sec.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_dpaa2_sec.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_mlx5.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_nitrox.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_null.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_octeontx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_openssl.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_scheduler.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_crypto_virtio.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_compress_mlx5.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_compress_octeontx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_compress_zlib.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_regex_mlx5.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_regex_cn9k.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_vdpa_ifc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_vdpa_mlx5.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_vdpa_sfc.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_cnxk.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_dlb2.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_dpaa.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_dpaa2.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_dsw.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_opdl.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_skeleton.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_sw.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_event_octeontx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_baseband_acc100.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_baseband_fpga_5gnr_fec.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_baseband_fpga_lte_fec.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_baseband_la12xx.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_baseband_null.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_baseband_turbo_sw.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_node.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_graph.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_flow_classify.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_pipeline.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_table.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_pdump.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_port.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_fib.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_ipsec.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_vhost.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_stack.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_security.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_sched.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_reorder.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_rib.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_dmadev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_regexdev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_rawdev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_power.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_pcapng.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_member.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_lpm.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_latencystats.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_kni.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_jobstats.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_ip_frag.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_gso.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_gro.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_gpudev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_eventdev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_efd.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_distributor.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_cryptodev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_compressdev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_cfgfile.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bpf.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bitratestats.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bbdev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_acl.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_timer.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_hash.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_metrics.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_cmdline.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_pci.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_ethdev.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_meter.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_net.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mbuf.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_mempool.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_rcu.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_ring.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_eal.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_telemetry.a
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_kvargs.a -Wl,--no-whole-archive
-Wl,--export-dynamic /usr/lib/gcc/x86_64-linux-gnu/11/libatomic.a
/usr/lib/x86_64-linux-gnu/libmlx5.a /usr/lib/x86_64-linux-gnu/libcrypto.a -ldl -pthread
/usr/lib/x86_64-linux-gnu/libz.a /usr/lib/x86_64-linux-gnu/libmlx4.a
/usr/lib/x86_64-linux-gnu/libibverbs.a /usr/lib/x86_64-linux-gnu/libbnxt_re-rdmav34.a
/usr/lib/x86_64-linux-gnu/libcxgb4-rdmav34.a /usr/lib/x86_64-linux-gnu/libefa.a
/usr/lib/x86_64-linux-gnu/libhns-rdmav34.a /usr/lib/x86_64-linux-gnu/libirdma-rdmav34.a
/usr/lib/x86_64-linux-gnu/libmthca-rdmav34.a /usr/lib/x86_64-linux-gnu/libocrdma-rdmav34.a
/usr/lib/x86_64-linux-gnu/libqedr-rdmav34.a /usr/lib/x86_64-linux-gnu/libvmw_pvrdma-rdmav34.a
/usr/lib/x86_64-linux-gnu/libhfi1verbs-rdmav34.a /usr/lib/x86_64-linux-gnu/libipathverbs-rdmav34.a
/usr/lib/x86_64-linux-gnu/librxe-rdmav34.a /usr/lib/x86_64-linux-gnu/libsiw-rdmav34.a
/usr/lib/x86_64-linux-gnu/libnl-route-3.a /usr/lib/x86_64-linux-gnu/libnl-3.a
/usr/lib/x86_64-linux-gnu/libpcap.a /usr/lib/x86_64-linux-gnu/libdbus-1.a
/usr/lib/x86_64-linux-gnu/libjansson.a -Wl,--as-needed -lm /usr/lib/x86_64-linux-gnu/libnuma.a
-Wl,--end-group
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libpcap.a(bpf_filter.o): in function `bpf_validate':
(.text+0x680): multiple definition of `bpf_validate';
/home/aizrailev/dpdk/install/lib/x86_64-linux-gnu/librte_bpf.a(bpf_bpf_validate.c.o):bpf_validate.c:(.text+0x22c0): first defined here
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libdbus-1.a(libdbus_1_la-dbus-sysdeps-unix.o): in function `_dbus_listen_systemd_sockets':
(.text+0x200e): undefined reference to `sd_listen_fds'
/usr/bin/ld: (.text+0x204f): undefined reference to `sd_is_socket'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.但是,如果我使用另一个显式调用pkg-config的meson.build来获取标志,那么一切都很好:
project('dpdk-app', 'c')
pkgconfig = find_program('pkg-config')
cflags_cmd = run_command(pkgconfig, '--cflags', 'libdpdk', check: true)
ldflags_cmd = run_command(pkgconfig, '--static', '--libs', 'libdpdk', check: true)
cflags = cflags_cmd.stdout().split()
ldflags = ldflags_cmd.stdout().split()
sources = files('main.c')
executable('dpdk-app', sources, c_args: cflags, link_args: ldflags)因此,介子使用依赖项的本机方式会导致错误。我是不是遗漏了什么?我不认为像我在第二个meson.build中那样调用pkg-config是实现我想要的效果的好方法,但是我找不到其他的选择。
发布于 2022-10-31 13:56:46
根据这些评论,这个问题被描述为meson fails to statically build the dpdk application。但是,在本地研究这个问题不会产生错误,下面的介子构建文件如下
project('dpdk-app', 'c')
pkgconfig = find_program('pkg-config')
cflags_cmd = run_command(pkgconfig, '--cflags', 'libdpdk', check: true)
ldflags_cmd = run_command(pkgconfig, '--static', '--libs', 'libdpdk', check: true)
cflags = cflags_cmd.stdout().split()
ldflags = ldflags_cmd.stdout().split()
sources = files('main.c')
executable('dpdk-app', sources, c_args: cflags, link_args: ldflags)步骤:
将dpdk示例将dpdk示例复制到自定义文件夹中(例如: /tmp/mytest)
./build/dpdk-app (它工作)F 226构建
但是我们得到了错误,如果我们使用介子构建
project('test', 'c')
dpdk = dependency('libdpdk', static: true)
sources = files('main.c')
executable('dpdk-app', sources, dependencies: dpdk, )仔细检查错误日志
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libpcap.a(bpf_filter.o): in function `bpf_validate':
(.text+0x460): multiple definition of `bpf_validate'; /usr/local/lib/x86_64-linux-gnu/librte_bpf.a(librte_bpf_bpf_validate.c.o):bpf_validate.c:(.text+0x23c0): first defined here错误来自librte_bpf.a和libpcap.a。
若要解决此问题,请将介子构建更新为
project('test', 'c',)
dpdk = dependency('libdpdk', static: true)
sources = files('main.c')
executable('dpdk-app', sources, dependencies: dpdk, link_args : ['-lsystemd', '-Wl,--allow-multiple-definition',])如上文所述,如果设置正确,则DPDK或pkg-config没有问题。但是实际的错误来自包含相同函数名和代码的库。
https://stackoverflow.com/questions/74238275
复制相似问题