【问题标题】:How can I specify library path when using Meson?使用介子时如何指定库路径?
【发布时间】:2020-07-18 09:18:10
【问题描述】:

我正在尝试使用 Meson 构建一个 c++ 项目。

问题是,我在/opt/conda 下有一些库 但在运行meson build 时无法弄清楚如何链接项目。 似乎只是在/usr/lib 目录中搜索。

据我了解,meson 使用cmakepkg-config 来查找库。 那么设置类似CMAKE_PREFIX_PATH 是一个可行的解决方案吗?如果是这样,我该怎么做?

提前致谢。

【问题讨论】:

    标签: cmake meson-build


    【解决方案1】:

    我看到了两种可能的方法来解决您的问题。

    • 第一个解决方案使用LIBRARY_PATH,这与LD_LIBRARY_PATH不同,后面会解释。
    • 第二种解决方案使用修改后的介子文件直接将选项传递给链接器。可选地,它还使用rpath,这样就无需在之后修改LD_LIBRARY_PATH

      1. 第一个解决方案

    在构建项目时,链接器使用LIBRARY_PATH(而不是LD_LIBRARY_PATH

    LIBRARY_PATH是gcc编译前用来搜索目录的 包含需要链接到您的静态和共享库 程序。

    LD_LIBRARY_PATH 被你的程序用来搜索目录 成功编译后包含共享库 并链接。

    更多详情LD_LIBRARY_PATH vs LIBRARY_PATH

    也许你可以试试

    export LIBRARY_PATH=/opt/conda/:$LIBRARY_PATH
    

    在运行介子构建您的项目之前。

    1. 第二种解决方案

    修改你的介子文件并使用rpath(可选)

    之前第一个解决方案的替代方法是直接修改您的 Meson 文件以将一些选项传递给 链接器

    这是我过去使用的东西,您可以轻松适应您的问题:

    #
    # blaspp
    #
    blaspp_lib = 'blaspp'
    blaspp_lib_dir = '/opt/slate/lib'
    blaspp_header_dir = '/opt/slate/include'
    
    blaspp_dep = declare_dependency(
        link_args : ['-L' + blaspp_lib_dir, '-l' + blaspp_lib],
        include_directories : include_directories(blaspp_header_dir))
    
    executable('test_blaspp',
           'test_blaspp.cpp',
           build_rpath : blaspp_lib_dir,
           install_rpath : blaspp_lib_dir,
           dependencies : [blaspp_dep])
    
    • declare_dependency(...) 定义传递给 链接器 的选项(这取代了在第一个解决方案中定义 LIBRARY_PATH 的需要)

    • executable(...) 定义rpath。这是一个可选步骤,将额外的库路径信息直接嵌入到可执行文件中。如果您使用它,您将不必在运行可执行文件时修改LD_LIBRARY_PATH

    更多详情: https://amir.rachum.com/blog/2016/09/17/shared-libraries/(查看“rpath 和运行路径”部分)并查看维基百科:https://en.wikipedia.org/wiki/Rpath

    【讨论】:

    • 谢谢!第二个解决方案成功了。事实证明,我不得不修改meson.build 文件,因为给定meson.build 文件使用的dependency() 函数似乎没有遵循LIBRARY_PATH
    • 感谢反馈,我会尝试看看LIBRARY_PATH解决方案
    • 第二种解决方案也对我有用。您如何将“build_rpath”与多个 libs 文件夹一起使用?对于几个 libs 和 libs 文件夹,上述解决方案需要进行哪些更改?
    • @yehudahs,感谢您的反馈。您是否尝试过 build_rpath :'dir_1;dir_2;dir_3'。根据介子文档 build_rpath 是“添加到目标的 rpath 定义的字符串”。不确定它是否有效,这是我的建议。
    【解决方案2】:

    如果我正确理解documentation,您可以使用不同的/其他构建系统作为子项目,它似乎并不基于cmake。 您应该能够在 cmake 项目的 CMakeList.txt 中定义 CMAKE_PREFIX_PATH,并在 meson 上下文中访问生成的库: 在您的 cmake 子项目中:

    add_library(cm_lib SHARED ${SOURCES})
    

    在你的介子中:

    cmake = import('cmake')
    
    # Configure the CMake project
    sub_proj = cmake.subproject('libsimple_cmake')
    
    # Fetch the dependency object
    cm_lib = sub_proj.dependency('cm_lib')
    
    executable(exe1, ['sources'], dependencies: [cm_lib])
    

    如果您只想将任何特定库传播到meson,那么看起来您需要bundle those third party library,或使用built-in options

    但首先:你检查过,/opt/conda 在你的LD_LIBRARY_PATH 中吗?

    【讨论】:

    • 谢谢@dboy 是的,我的LD_LIBRARY_PATH 中确实有/opt/conda/lib,但在配置构建环境时它并没有真正帮助。我试图构建的项目是基于 GStreamer 的,并且给出了他们的大部分 meson.build 文件。我只是想包含这些库,因此将其重新配置为 cmake 子项目并不是我正在寻找的解决方案。但是捆绑第三方库似乎可行,所以我会研究一下。
    猜你喜欢
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2013-03-26
    相关资源
    最近更新 更多