Не удалось статически связать dpdk с помощью директивы meson dependency()

Я пытаюсь использовать meson для создания примера helloworld dpdk в качестве отдельного приложения. Я хочу, чтобы приложение было статически связано с библиотеками dpdk.

Я скачал dpdk 22.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.

Однако, если я использую другой meson.build, который явно вызывает pkg-config для получения флагов, то все в порядке:

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)

Итак, нативный для мезона способ использования зависимостей приводит к ошибке. Я что-то упускаю? Я не думаю, что вызов pkg-config так, как я это делал во втором файле meson.build, — это хороший способ сделать то, что я хочу, но я не могу найти других вариантов.

не могли бы вы обновить 1) версию dpdk, 2) используется ли скрипт cmake, meson или bash для сборки 3) отладка или подробный вывод ошибки 4) или наименьшие шаги для воспроизведения ошибки? . Можете ли вы сначала перепроверить, есть ли уже экземпляр DPDK на машине сборки с помощью pkg-config --modversion libdpdk.

Vipin Varghese 31.10.2022 01:39

@VipinVarghese, 1) я использую последний dpdk-22.07 2) я использую мезон для его сборки 3) я не знаю, как сделать вывод более подробным, не могли бы вы мне помочь с этим? 4) Извините, если что-то непонятно, но я считаю, что мой вопрос содержит шаги для воспроизведения ошибки - я предоставляю файл meson.build и шаги, которые привели меня к ошибке 5) На этой машине не установлен другой dpdk

Arneid 31.10.2022 08:17

У вас была возможность изучить проблему связывания, как объяснено в ответах?

Vipin Varghese 01.11.2022 14:30

пожалуйста, найдите решение, указанное в ответе. если вы найдете это полезным, пожалуйста, примите и проголосуйте

Vipin Varghese 10.11.2022 16:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

на основании комментариев проблема описана как 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)

Шаги:

  1. скопируйте пример dpdk helloworld в пользовательскую папку (пример: /tmp/mytest)
  2. добавьте файл meson.build в папку.
  3. заполнить содержимое общими шагами как
  • используйте meson-ninja для сборки приложения (meson build; ninja -C build)
  • приложение собирается без ошибок
  • запустите приложение с помощью ./build/dpdk-app (работает)

Но мы получим ошибку, если будем использовать мезонную сборку как

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, если настройки верны. Но фактическая ошибка связана с библиотеками, содержащими то же имя функции и код.

Описание проблемы может быть неясным, извините за это. Проблема не возникает при ручном использовании pkg-config, только с зависимостью('libdpdk', static: true). 1. Я использую Ubuntu 22.04. У меня действительно не было установленного libsystemd-dev, но это не помогло 2. Я думаю, что это исправление на самом деле не было добавлено, я не вижу его в репозитории. У меня есть PKG_CONFIG_PATH, указывающий на локально установленный DPDK. Не могли бы вы уточнить, как я должен проверить это? Какой вариант инструмента -d вы имеете в виду? В любом случае, ручной вызов pkg-config из meson.build работает, поэтому я не думаю, что это проблема pkg-config.

Arneid 02.11.2022 08:21

@Arneid Could you please clarify how should I verify it? What tool's -d option you mean? пожалуйста, поделитесь ссылкой на встречу (зум, googlemeet)

Vipin Varghese 02.11.2022 09:55

Я связался с вами через LinkedIn, думаю, так будет лучше.

Arneid 02.11.2022 10:42

С предложенным вами meson.build проблемы с bpd_validate исчезли, но проблема с libdbus осталась: ​eps-unix.o): в функции _dbus_listen_systemd_sockets': (.text+0x200e): undefined reference to sd_listen_fds' /usr/bin/ld: (.text+0x204f): неопределенная ссылка на `sd_is_socket' collect2: ошибка: ld вернул 1 статус выхода "

Arneid 11.11.2022 08:31

Извините, но я этого не помню. Я уверен, что с тех пор я не удалил ни одного пакета, и у меня установлен libsystemd-dev. В любом случае, pkg-config знает, где взять sd_listen_fds, так почему же meson этого не знает?

Arneid 11.11.2022 12:26

пожалуйста, предложите способ вызвать ошибку с _dbus_listen_systemd_sockets. Как я не могу сделать то же самое. на нашей последней встрече мы установили отсутствующий пакет, и эта конкретная ошибка была устранена с помощью -lsystemd-daemon. пожалуйста, предложите способ вызвать ошибку с _dbus_listen_systemd_sockets. Как я не могу сделать то же самое. на нашей последней встрече мы установили отсутствующий пакет, и эта конкретная ошибка была устранена, верно?

Vipin Varghese 11.11.2022 12:26

отправил приглашение на отладку. будет приятно увидеть ошибку, воспроизведенную с помощью -lsystemd-daemon

Vipin Varghese 11.11.2022 12:28

Это действительно работает, если я добавлю -lsystemd (libsystemd-daemon кажется устаревшим, поэтому -lsystemd-daemon не работает в моей системе). Не могли бы вы отредактировать свой ответ, чтобы я принял его? Я имею в виду, link_args должно быть ['-lsystemd', '-Wl,--allow-multiple-definition']. Однако я до сих пор не понимаю, почему meson не может понять, что нам нужен этот флаг из команды dependency(). Я думал, что он внутренне использует pkg-config для получения флагов, но тогда зачем мне указывать какие-то link_args вручную?

Arneid 11.11.2022 13:32

@Arneid, вы можете проверить результат pkg-config pkg-config --cflags --libs --static libdpdk, если он есть -lsystemd? Если это не так, есть какая-то другая библиотека, которая может косвенно включать systemd. Но, как упоминалось в ubutnu 20.04, в моей настройке я не вижу проблемы, может быть, это зависит от дистрибутива?

Vipin Varghese 11.11.2022 13:51

Нет, вывод pkg-config не имеет ничего общего с -lsystemd. Похоже, это действительно что-то зависимое от дистрибутива. Прав ли я в своем предположении, что dependency() мезона не просто вызывает pkg-config для получения флагов?

Arneid 11.11.2022 14:08
meson's dependency() does not simply call pkg-config to obtain the flags? да, это верное предположение. обновленный ответ, чтобы включить systemd
Vipin Varghese 11.11.2022 14:20

Большое спасибо за твою помощь! Я не могу проголосовать за ваш ответ, потому что мне не хватает очков репутации :)

Arneid 11.11.2022 14:44

Другие вопросы по теме