Ошибка компоновщика в Meson & Ninja при попытке добавить пользовательскую зависимость - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь добавить библиотеку на основе исходного кода в свой проект, используя 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)

And ./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 не существует, но компилятор скомпилировал код, как будто зависимость уже существует.

1 Ответ

1 голос
/ 03 октября 2019

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

// 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, предоставляемый вашей библиотекой
...