Как я могу указать путь к библиотеке при использовании Meson?

Я пытаюсь создать проект на C ++ с помощью Meson.

Дело в том, что у меня есть несколько библиотек в /opt/conda, но я не могу понять, как связать проект при запуске meson build. Похоже, поиск выполняется только в /usr/lib каталоге.

Насколько я понял, meson использует cmake и pkg-config для поиска библиотек. Тогда будет ли установка чего-то вроде CMAKE_PREFIX_PATH возможным решением? и если да, то как я могу это сделать?

Заранее спасибо.


person Jinu    schedule 06.04.2020    source источник


Ответы (2)


Я вижу два возможных подхода к решению вашей проблемы.

  • в первом решении используется LIBRARY_PATH, который отличается от LD_LIBRARY_PATH, как описано ниже.
  • второе решение использует модифицированный мезон-файл для прямой передачи параметров компоновщику. Необязательно, он также использует rpath, что избавляет от необходимости изменять LD_LIBRARY_PATH впоследствии.

    1. First solution

При создании проекта компоновщик использует LIBRARY_PATH (а не LD_LIBRARY_PATH)

LIBRARY_PATH используется gcc перед компиляцией для поиска в каталогах, содержащих статические и совместно используемые библиотеки, которые необходимо связать с вашей программой.

LD_LIBRARY_PATH используется вашей программой для поиска в каталогах, содержащих общие библиотеки, после того, как она была успешно скомпилирована и связана.

дополнительные сведения: LD_LIBRARY_PATH против LIBRARY_PATH

Может ты можешь попробовать

export LIBRARY_PATH=/opt/conda/:$LIBRARY_PATH

перед запуском meson для сборки вашего проекта.

  1. Второе решение

Измените свой мезон-файл и используйте rpath (необязательно)

Альтернативой первому предыдущему решению является прямое изменение файла Meson для передачи некоторых параметров компоновщику.

Вот кое-что, что я использовал в прошлом, и вы можете легко приспособиться к вашей проблеме:

#
# blaspp
#
blaspp_lib = 'blaspp'
blaspp_lib_dir = '/opt/slate/lib'
blaspp_header_dir = '/opt/slate/include'

blaspp_dep = declare_dependency(
    link_args : ['-L' + blaspp_lib_dir, '-l' + blaspp_lib],
    include_directories : include_directories(blaspp_header_dir))

executable('test_blaspp',
       'test_blaspp.cpp',
       build_rpath : blaspp_lib_dir,
       install_rpath : blaspp_lib_dir,
       dependencies : [blaspp_dep])
  • declare_dependency (...) определяет параметры для передачи компоновщику (это заменяет необходимость определять LIBRARY_PATH в первом решении)

  • исполняемый файл (...) определяет rpath. Это необязательный шаг, который встраивает дополнительную информацию о пути к библиотеке непосредственно в исполняемый файл. Если вы используете это, вам не нужно будет изменять LD_LIBRARY_PATH при запуске вашего исполняемого файла.

Дополнительные сведения: https://amir.rachum.com/blog/2016/09/17/shared-libraries/ (см. раздел «rpath и runpath») и см. википедию: https://en.wikipedia.org/wiki/Rpath

person Picaud Vincent    schedule 07.04.2020
comment
Спасибо! Второе решение помогло. Оказывается, мне все равно пришлось изменить файл meson.build, потому что функция dependency(), которую использовал данный файл meson.build, похоже, не соответствует LIBRARY_PATH. - person Jinu; 07.04.2020
comment
Спасибо за отзыв, попробую взглянуть на решение LIBRARY_PATH - person Picaud Vincent; 07.04.2020
comment
Второе решение тоже сработало. Как использовать build_rpath с несколькими папками библиотек? что нужно изменить в приведенном выше решении для нескольких папок libs и libs? - person yehudahs; 09.09.2020
comment
@yehudahs, спасибо за отзыв. Вы пробовали build_rpath: 'dir_1; dir_2; dir_3'. Согласно meson doc build_rpath - это «строка, добавляемая к определению rpath цели». Не уверен, что это работает, это мое предложение. - person Picaud Vincent; 09.09.2020

Если я правильно понимаю документацию, вы можете использовать другую / другую систему сборки в качестве подпроекта, и это не похоже на cmake. Вы должны иметь возможность определить CMAKE_PREFIX_PATH в CMakeList.txt проекта cmake и получить доступ к сгенерированной библиотеке в meson контексте: в подпроекте cmake:

add_library(cm_lib SHARED ${SOURCES})

в вашем мезоне:

cmake = import('cmake')

# Configure the CMake project
sub_proj = cmake.subproject('libsimple_cmake')

# Fetch the dependency object
cm_lib = sub_proj.dependency('cm_lib')

executable(exe1, ['sources'], dependencies: [cm_lib])

если вы хотите распространить какую-либо конкретную библиотеку только на meson, то похоже, что вам нужно будет связать эту стороннюю библиотеку или с помощью встроенных параметров.

Но прежде всего: вы проверили, есть ли /opt/conda в вашем LD_LIBRARY_PATH?

person dboy    schedule 06.04.2020
comment
Спасибо @dboy. Да, в моем LD_LIBRARY_PATH есть /opt/conda/lib, но это не очень помогло при настройке среды сборки. Проект, который я пытался создать, был основан на GStreamer, и большая часть их meson.build файла была предоставлена. Я просто хотел включить библиотеки, поэтому перенастройка его на подпроект cmake не была решением, которое я искал. Но сборка сторонней библиотеки кажется возможной, поэтому я рассмотрю ее. - person Jinu; 07.04.2020