Linker 介子中的连接错误&;忍者在尝试添加自定义依赖项时

Linker 介子中的连接错误&;忍者在尝试添加自定义依赖项时,linker,dependencies,linker-errors,meson-build,Linker,Dependencies,Linker Errors,Meson Build,我正在尝试使用介子将基于源代码的库添加到我的项目中。但当我尝试这样做时,我会发现对象文件链接错误 我尝试向项目可执行文件添加自定义依赖项,但当然,它说它是未定义的(srclibdep,在前面的代码中),因为它是在项目可执行文件之后定义的。但若我在项目可执行文件之前定义,那个么我就不能链接 这是我的./meson.build project('ProjectName','cpp',version:'0.1',默认选项:['warning\u level=3','cpp\u std=c++14']

我正在尝试使用介子将基于源代码的库添加到我的项目中。但当我尝试这样做时,我会发现对象文件链接错误

我尝试向项目可执行文件添加自定义依赖项,但当然,它说它是未定义的(
srclibdep
,在前面的代码中),因为它是在项目可执行文件之后定义的。但若我在项目可执行文件之前定义,那个么我就不能链接

这是我的./meson.build

project('ProjectName','cpp',version:'0.1',默认选项:['warning\u level=3','cpp\u std=c++14']
srclibinc=include_目录('SourceLibraryName')
cpp=meson.get\u编译器('cpp')
添加语言(“cpp”)
proj=executable('ProjectName','main.cpp',install:true,include\u目录:srclibinc)
srclibdep=声明依赖关系(包括目录:srclibinc,链接:proj)
和./SourceLibraryName/meson.build

files=run_命令('files.sh').stdout().strip().split('\n'))
foreach f:文件
安装_头(f)
endforeach
srclib=shared_库('SourceLibrary',files,install:true)
pkg_mod=import('pkgconfig')
pkg_mod.generate(库:srclib,版本:'0.1',名称:'libsrc',说明:'基于源代码的库')
我收到数百个链接错误,说
x::Y
引用不存在,但编译器编译代码时好像依赖项已经存在一样。

我认为应该存在

// 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)
附言:

与事件无关,但只是注意到:

  • 如果仅在项目中使用共享库,则不必生成pkg配置文件
  • 将版本添加到共享库是一种很好的做法,尤其是当它将与其他项目共享时:

    共享_库('SourceLibrary',文件,安装:true,版本:meson.project_version())

meson.project_version()也可以用于pkg配置文件,所以您不会忘记在所有地方更新它

  • 您并没有为库安装任何头文件,所以其他项目找不到您的库提供的API

谢谢。您是否知道如何解决链接器问题,即
\uu原子\u加载\u4
和其他原子未被引用?尝试将
全局参数('-latomic',language:'cpp')
cpp参数:'-latomic'
添加到可执行文件中,但它们似乎什么都不做。@Mr.deleteMessages尝试添加全局参数('-latomic',language:'cpp'),或者更好地添加限制范围的项目参数,
link\u args:'-latomic'
在可执行文件中并更改
cpp\u std=gnu++17
(因为我听说原子问题只存在于叮当声中,而不是GCC中),但它们似乎都不起作用。@Mr.deletemycessages刚刚找到了mesa处理这个问题的方法:检查dep\u原子对象的搜索,但在您的例子中只使用dep\u atomic=cc。find\u library('atomic'))然后添加到可执行文件的依赖项列表中(…)就足够了