мезон не понимает зависимости библиотеки libhandy

Я создаю приложение, которое включает библиотеки gtk и libhandy. Я пытаюсь связать libhandy со своим проектом. Я использую систему сборки мезон. Чтобы добавить зависимость к meson, я выполнил следующую документацию отсюда: 1 < / а>

Я клонировал библиотеку libhandy в свой проект в project_root/subprojects/libhandy/ Вот мой project_root/meson.build файл

project('githandytest', 'c',
          version: '0.1.0',
    meson_version: '>= 0.50.0',
  default_options: [ 'warning_level=2',
                     'c_std=gnu11',
                   ],
)

libhandy_dep = dependency('libhandy-0.0', version: '>= 0.0.13')
if not libhandy_dep.found()
  libhandy = subproject(
    'libhandy',
    install: false,
    default_options: [
      'examples=false',
      'package_subdir=my-project-name',
      'tests=false',
    ]
  )
  libhandy_dep = libhandy.get_variable('libhandy_dep')
endif

i18n = import('i18n')

config_h = configuration_data()
config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
config_h.set_quoted('GETTEXT_PACKAGE', 'githandytest')
config_h.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir')))
configure_file(
  output: 'githandytest-config.h',
  configuration: config_h,
)
add_project_arguments([
  '-I' + meson.build_root(),
], language: 'c')


subdir('data')
subdir('src')
subdir('po')
subdir('subprojects')

meson.add_install_script('build-aux/meson/postinstall.py')

Файл, в который я включаю <libhandy.h>, - это main.c, расположенный в project_root/src Вот project_root/src/meson.build

githandytest_sources = [
  'main.c'
]

githandytest_deps = [
  dependency('gio-2.0', version: '>= 2.50'),
  dependency('gtk+-3.0', version: '>= 3.22'),
  dependency('libhandy-0.0')
]

gnome = import('gnome')

executable('githandytest', githandytest_sources,
  dependencies: githandytest_deps,
  install: true,
)

Я также добавил исходники в манифест проекта, так как распространяю с помощью flatpak.

{
    "app-id" : "org.example.App",
    "runtime" : "org.gnome.Platform",
    "runtime-version" : "3.38",
    "sdk" : "org.gnome.Sdk",
    "command" : "githandytest",
    "finish-args" : [
        "--share=network",
        "--share=ipc",
        "--socket=fallback-x11",
        "--socket=wayland"
    ],
    "cleanup" : [
        "/include",
        "/lib/pkgconfig",
        "/man",
        "/share/doc",
        "/share/gtk-doc",
        "/share/man",
        "/share/pkgconfig",
        "*.la",
        "*.a"
    ],
    "modules" : [
        {
            "name" : "githandytest",
            "builddir" : true,
            "buildsystem" : "meson",
            "sources" : [
                {
                    "type" : "git",
                    "url" : "file:///home/davtyan/Projects/githandytest"
                }
            ]
        },
        {
      "name" : "libhandy",
      "buildsystem" : "meson",
      "builddir" : true,
      "config-opts": [
        "-Dexamples=false",
        "-Dtests=false"
      ],
      "sources" : [
        {
          "type" : "git",
          "url" : "https://source.puri.sm/Librem5/libhandy.git"
        }
      ]
    }
    ]
}

При запуске проекта у меня возникает следующая проблема: project_root/meson.build:9:0: ERROR: Dependency "libhandy-0.0" not found, tried pkgconfig and cmake

Прошу прощения за такой расплывчатый вопрос. Я очень новичок в системе сборки мезонов и не могу понять, почему это происходит. Я использую среду разработки gnome-builder, если это помогает.


person Vahan    schedule 24.12.2020    source источник


Ответы (1)


Похоже, вам не нужно создавать объект зависимости второй раз dependency('libhandy-0.0') и использовать уже созданный:

githandytest_deps = [
  dependency('gio-2.0', version: '>= 2.50'),
  dependency('gtk+-3.0', version: '>= 3.22'),
  libhandy_dep
]

Я имею в виду, что у вас есть эта ошибка, потому что он пытается найти (с помощью pkg-config) эту зависимость, не глядя на вашу оценку libhandy_dep.

Однако обратите внимание, что оценку этой зависимости (pkg-config + subproject) можно упростить, просто:

libhandy_dep = dependency('libhandy-0.0', version: '>= 0.0.13', 
             fallback : ['libhandy', 'libhandy_dep'],
             default_options: ['examples=false', 'package_subdir=my-project-name', 'tests=false'])

поскольку из docs:

['subproj_name', 'subproj_dep'], первое значение - это имя подпроекта, а второе - имя переменной в этом подпроекте, который содержит объект зависимости, такой как возвращаемое значение declare_dependency или dependency (),

person pmod    schedule 25.12.2020
comment
Большое спасибо, это решило проблему. Однако теперь я застрял с другой проблемой. Когда я вставляю ‹libhandy.h› и компилирую исходный файл, он работает нормально. Но всякий раз, когда я вызываю любую функцию или объект, определенный в ‹libhandy.h›, он показывает следующую ошибку: ошибка при загрузке разделяемых библиотек: libhandy-1.so.0: невозможно открыть файл общих объектов: нет такого файла или каталога - person Vahan; 25.12.2020
comment
@Vahan это происходит из-за того, что общая библиотека построена в какой-то неизвестной папке для загрузчика времени выполнения, попробуйте установить параметр build_rpath для исполняемого файла. Я не уверен, где он должен приземлиться ... возможно, вы попытаетесь добавить: исполняемый файл (...., build_rpath: current_build_dir () + '/ libhandy' ...), но это просто мое безумное предположение - person pmod; 26.12.2020
comment
возможно, это также поможет stackoverflow.com/questions/61058722/ - person pmod; 26.12.2020