I'm trying to use meson to build dpdk's helloworld example as a standalone application. I want the application to be linked statically against dpdk libraries.
I've downloaded dpdk 22.07 to /home/aizrailev/dpdk
and installed it to /home/aizrailev/dpdk/install
(if dpdk is installed system-wide, everything works fine). Then I go to /home/aizrailev/dpdk/examples/helloworld
and try to use the following meson.build to build the app (before that, I run 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)
Steps to build the app:
meson build
cd build/
ninja
The following error occurs:
[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.
However, if I use another meson.build that explicitly calls pkg-config to obtain the flags, then everything is fine:
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)
So, the native way for meson to use dependencies leads to an error. Am I missing something? I don't think that invoking pkg-config the way I did in the second meson.build is a good way of doing what I want, but I can't find another options.
based on the comments the issue is described as meson fails to statically build the dpdk application
. But exploring the issue locally does not produce the error with the below meson build file as
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)
Steps:
./build/dpdk-app
(it works)But we get error, if we use meson build as
project('test', 'c')
dpdk = dependency('libdpdk', static: true)
sources = files('main.c')
executable('dpdk-app', sources, dependencies: dpdk, )
Closely examining the error logs
/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
The error is coming from librte_bpf.a and libpcap.a.
To work around the issue, please update meson build to
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',])
As shared above there is no issue with DPDK or pkg-config if the settings are correct. But actual error is from libraries housing the same function name and code.