介子:如何使 find_library() 使用不寻常的路径?

Meson: how to make find_library() works with an unusual path?

对于我的 Meson 项目,我有一个依赖项位于 "unusual" 位置:

/opt/MyDependence/lib/libmyLib.so
/opt/MyDependence/include/myLib.hpp

我的介子文件是:

project('Test', ['cpp'])

cpp = meson.get_compiler('cpp')
myLib_dep = cpp.find_library('myLib', required: true)

显然介子找不到库

Meson.build:5:0: ERROR: C++ library 'myLib' not found

问题是我不知道 "canonical" 添加额外搜索路径的方法,以便 Meson 可以找到我的库。有什么想法吗?


更新: 请注意,即使我使用:

meson --libdir=/opt/MyDepedence/lib build

我收到此错误消息:

meson.build:1:0: ERROR: The value of the 'libdir' option is '/opt/MyDepedence/lib' which must be a subdir of the prefix '/usr/local'.
Note that if you pass a relative path, it is assumed to be a subdir of prefix.

终于找到解决方法了,必须用LIBRARY_PATH

export LIBRARY_PATH=/opt/MyDepedence/lib
meson build

注:注意这不是LD_LIBRARY_PATH,区别见there

另请阅读此 Meson/issues/217 。对于 Windows,LIBRARY_PATH 等价物似乎是 LIBPATH(但我无法检查,因为我只在 Linux 下 运行)。


另一种方法是 "manually" 定义新的依赖关系。在您的介子项目中:

project('Test, ['cpp'])

myLib_dep = declare_dependency(link_args : ['-L/opt/MyDependence/lib', '-lmyLib'],
                               include_directories : ['/opt/MyDependence/include'])


exe1 = executable('main', ['main.cpp'], dependencies : [myLib_dep])

可以进行的改进是将此 "manual" 设置存储到 meson_options.txt 中。


注意:我终于回答了我的问题,但我仍然愿意寻求更好的解决方案。

解决此问题的标准方法是使用 pkg-config。简而言之,库安装过程应该包括生成特殊“mylib.pc”文件的阶段(从头开始,或者通常从模板“mylib.pc .in" - 在互联网上搜索,有很多例子)。然后将这些包含 include/library 目录、依赖项等信息的小键值文件安装到某个已知位置,通常是 /usr/lib/pkgconfig/。 Meson 自然地在引擎盖下运行 pkg-config 并在你有这样的东西时找到你的库

mylib_dep = dependency('mylib', required: true)

在你的meson.build.

更新

关于libdir介子选项错误,你也可以尝试添加选项prefix:

meson --prefix=/opt/MyDepedence --libdir=lib build

另请注意,使用此命令行,您实际上隐式调用了 setup 命令(没有命令 build,因为您将使用ninja) 和 build 是将使用您的选项创建的构建目录。检查 this。这就是为什么更明显地写:

meson setup build_dir --prefix=/opt/MyDepedence --libdir=lib

find_library 现在有一个可选参数 dirs(自 0.53.0 起),它指示一个额外的绝对路径列表,用于查找程序名称。

cpp = meson.get_compiler('cpp')
myLib_dep = cpp.find_library('myLib', dirs: '/opt/MyDepedence/lib', required: true)