【问题标题】:How to link shared libraries in custom path directly without specifying RPATH?如何在不指定 RPATH 的情况下直接链接自定义路径中的共享库?
【发布时间】:2017-08-20 21:04:20
【问题描述】:

我使用的是 Ubuntu 16.04,我需要使用外部库 (MCR)。它将所有共享库放在MATLAB/bin/glnxa64/ 文件夹中。我只需要那里的 libmx.so,但那里的库与 /usr/lib 中的库名称完全相同,但它们实际上不同(因为文件大小不同),例如 libtiff.so.5

这成为一个问题,因为当我在 CMake 中使用 find_library 函数将 MATLAB/bin/glnxa64/ 添加到 RPATH 以便为我的应用程序链接到 libmx.so 时,因为我的应用程序还依赖于另一个外部库 (OpenCV)在构建时链接到/usr/lib 中的libtiff.so.5,当我编译我的应用程序时,它显示编译错误

/usr/lib/libopencv_imgcodecs.so.3.3.0:未定义的引用 `TIFFReadDirectory@LIBTIFF_4.0'

这是因为我的应用程序试图链接到 MATLAB/bin/glnxa64/ 中的 libtiff.so.5 而不是 /usr/lib,因为 RPATH 的优先级高于默认目录。解决这个问题的最佳方法是什么?

我尝试将MATLAB/bin/glnxa64/ 中的libtiff.so.5 重命名为libtiff_old.so.5。这解决了它,但非常难看。

无论如何我可以交替搜索优先级,以便 RPATH 遵循默认目录吗?或者我可以在 CMake 中做些什么,这样我的应用程序就可以直接链接到 libmx.so,而无需将 MATLAB/bin/glnxa64/ 添加到 RPATH 中来搞砸?

【问题讨论】:

    标签: c++ cmake shared-libraries dynamic-linking rpath


    【解决方案1】:

    好吧,首先看看你的 cmake 文件会很好,但是唉..

    您可以尝试使用它,<...> 是您安装 MATLAB 的基本目录,可能是 /usr/local/ 或 /opt。

    find_library (MATLAB_RUNTIME libmx 
        PATHS <...>/MATLAB/bin/glnxa64/
        NO_DEFAULT_PATH )
    

    【讨论】:

    • 这正是我在 cmake 文件中使用 find_library 的方式。相当于通过 objdump 验证将此路径添加到 RPATH。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多