Я пытаюсь использовать 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, — это хороший способ сделать то, что я хочу, но я не могу найти других вариантов.
@VipinVarghese, 1) я использую последний dpdk-22.07 2) я использую мезон для его сборки 3) я не знаю, как сделать вывод более подробным, не могли бы вы мне помочь с этим? 4) Извините, если что-то непонятно, но я считаю, что мой вопрос содержит шаги для воспроизведения ошибки - я предоставляю файл meson.build и шаги, которые привели меня к ошибке 5) На этой машине не установлен другой dpdk
У вас была возможность изучить проблему связывания, как объяснено в ответах?
пожалуйста, найдите решение, указанное в ответе. если вы найдете это полезным, пожалуйста, примите и проголосуйте
на основании комментариев проблема описана как 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)
Шаги:
./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 Could you please clarify how should I verify it? What tool's -d option you mean?
пожалуйста, поделитесь ссылкой на встречу (зум, googlemeet)
Я связался с вами через LinkedIn, думаю, так будет лучше.
С предложенным вами 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 статус выхода "
Извините, но я этого не помню. Я уверен, что с тех пор я не удалил ни одного пакета, и у меня установлен libsystemd-dev. В любом случае, pkg-config знает, где взять sd_listen_fds
, так почему же meson этого не знает?
пожалуйста, предложите способ вызвать ошибку с _dbus_listen_systemd_sockets. Как я не могу сделать то же самое. на нашей последней встрече мы установили отсутствующий пакет, и эта конкретная ошибка была устранена с помощью -lsystemd-daemon. пожалуйста, предложите способ вызвать ошибку с _dbus_listen_systemd_sockets. Как я не могу сделать то же самое. на нашей последней встрече мы установили отсутствующий пакет, и эта конкретная ошибка была устранена, верно?
отправил приглашение на отладку. будет приятно увидеть ошибку, воспроизведенную с помощью -lsystemd-daemon
Это действительно работает, если я добавлю -lsystemd
(libsystemd-daemon
кажется устаревшим, поэтому -lsystemd-daemon
не работает в моей системе). Не могли бы вы отредактировать свой ответ, чтобы я принял его? Я имею в виду, link_args
должно быть ['-lsystemd', '-Wl,--allow-multiple-definition']
. Однако я до сих пор не понимаю, почему meson не может понять, что нам нужен этот флаг из команды dependency()
. Я думал, что он внутренне использует pkg-config для получения флагов, но тогда зачем мне указывать какие-то link_args
вручную?
@Arneid, вы можете проверить результат pkg-config pkg-config --cflags --libs --static libdpdk
, если он есть -lsystemd
? Если это не так, есть какая-то другая библиотека, которая может косвенно включать systemd
. Но, как упоминалось в ubutnu 20.04, в моей настройке я не вижу проблемы, может быть, это зависит от дистрибутива?
Нет, вывод pkg-config
не имеет ничего общего с -lsystemd
. Похоже, это действительно что-то зависимое от дистрибутива. Прав ли я в своем предположении, что dependency()
мезона не просто вызывает pkg-config
для получения флагов?
meson's dependency() does not simply call pkg-config to obtain the flags?
да, это верное предположение. обновленный ответ, чтобы включить systemd
Большое спасибо за твою помощь! Я не могу проголосовать за ваш ответ, потому что мне не хватает очков репутации :)
не могли бы вы обновить 1) версию dpdk, 2) используется ли скрипт cmake, meson или bash для сборки 3) отладка или подробный вывод ошибки 4) или наименьшие шаги для воспроизведения ошибки? . Можете ли вы сначала перепроверить, есть ли уже экземпляр DPDK на машине сборки с помощью
pkg-config --modversion libdpdk
.