Ошибка компоновщика в Meson & Ninja при попытке добавить пользовательскую зависимость

Я пытаюсь добавить в свой проект исходную библиотеку с помощью Meson. Но когда я пытаюсь это сделать, я получаю ошибки связывания объектных файлов.

Я попытался добавить настраиваемую зависимость к исполняемому файлу проекта, но, конечно, он говорит, что он не определен (srclibdep в коде впереди), поскольку он определяется после исполняемого файла проекта. Но если я определю до исполняемого файла Project, то я не смогу связать.

Это мой ./meson.build

project('ProjectName', 'cpp', version: '0.1', default_options: ['warning_level=3', 'cpp_std=c++14'])

srclibinc = include_directories('SourceLibraryName')
cpp = meson.get_compiler('cpp')
add_languages('cpp')
proj = executable('ProjectName', 'main.cpp', install: true, include_directories: srclibinc)
srclibdep = declare_dependency(include_directories: srclibinc, link_with: proj)

И ./SourceLibraryName/meson.build

files = run_command('files.sh').stdout().strip().split('\n')

foreach f: files
        install_headers(f)
endforeach

srclib = shared_library('SourceLibrary', files, install: true)
pkg_mod = import('pkgconfig')
pkg_mod.generate(libraries: srclib, version: '0.1', name: 'libsrc', description: 'Source-based library.')

Я получаю сотни ошибок связывания, в которых говорится, что ссылка x::Y не существует, но компилятор скомпилировал код, как будто зависимость уже существует.


person Mr.DeleteMyMessages    schedule 02.10.2019    source источник


Ответы (1)


Я думаю так должно быть

// make srclib available to code below:
subdir('SourceLibraryName')

// create dependency object with library to link against:
srclibdep = declare_dependency(link_with: srclib)

// add this object to dependencies:
proj = executable('ProjectName', 'main.cpp', install: true, include_directories: srclibinc, dependencies : srclibdep)

PS:

Не имеет отношения к делу, но только что заметил:

  • вам не нужно создавать файл pkg-config, если вы используете общую библиотеку только в своем проекте
  • Хорошая практика - добавить версию в общую библиотеку, особенно если она будет использоваться другими проектами:

    shared_library ('SourceLibrary', файлы, установка: true, версия: meson.project_version ())

meson.project_version () вы также можете использовать для файла pkg-config, поэтому вы не забудете обновить его во всех местах

  • вы не устанавливаете никаких заголовков для библиотеки, поэтому другие проекты не найдут API, который предоставляет ваша библиотека
person pmod    schedule 03.10.2019
comment
Спасибо. У вас есть идеи, как исправить проблему компоновщика, в которой __atomic_load_4 и другие атомы не упоминаются? Пытался сделать add_global_arguments('-latomic', language: 'cpp') и cpp_args: '-latomic' для исполняемого файла, но похоже, что они буквально ничего не делают. - person Mr.DeleteMyMessages; 03.10.2019
comment
@ Mr.DeleteMyMessages попробуйте add_global_link_arguments (), язык не нужен, или, может быть, даже лучше add_project_link_arguments, который ограничивает область действия - person pmod; 03.10.2019
comment
Пробовал и это, link_args: '-latomic' в исполняемом файле и изменяя cpp_std=gnu++17 (потому что я слышал, что атомарная проблема только в Clang, а не в GCC), но ни один из них, похоже, не работает. - person Mr.DeleteMyMessages; 04.10.2019
comment
@ Mr.DeleteMyMessages только что узнал, как с этим справляется mesa: проверьте gitlab.freedesktop. org / mesa / mesa / blob / master / meson.build выполните поиск объекта dep_atomic, но в вашем случае просто используйте dep_atomic = cc.find_library ('atomic'), а затем добавьте в список зависимостей исполняемый файл (. ..) может быть достаточно - person pmod; 04.10.2019