【问题标题】:Cmake: linking shared libraryCmake:链接共享库
【发布时间】:2012-01-16 13:38:39
【问题描述】:

我之前做过几次,但不知何故这次我被卡住了。我有一个可执行文件“myapp”和一个自己的共享库“mylib”。在我的 cmakelists 中,我有以下内容:

ADD_LIBRARY(mylib SHARED ${SOURCES_LIB})
INSTALL(TARGETS mylib DESTINATION .)
ADD_EXECUTABLE(myapp ${SOURCES_APP})
TARGET_LINK_LIBRARIES(myapp ${QT_LIBRARIES} mylib)
INSTALL(TARGETS myapp DESTINATION .)

一切都正确编译和链接,但是当我启动 myapp 时,我收到以下错误:

error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

lib 和可执行文件存在于安装目录中。当我通过将上述 cmakelists 的第一行更改为:

ADD_LIBRARY(mylib STATIC ${SOURCES_LIB})

然后一切正常 100%。

有谁知道我做错了什么?

【问题讨论】:

    标签: static cmake libraries shared


    【解决方案1】:

    在安装库和可执行文件期间,查找库的运行时路径会从可执行文件中删除。因此,您的库必须驻留在运行时库搜索路径中。例如在 Linux 下,尝试在启动可执行文件时将 LD_LIBRARY_PATH 设置为包含已安装库的目录。

    【讨论】:

    • 在 cmake 中,您可以设置: SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/libfolder") 其中 libfolder 是安装共享库的目录。这仅适用于 Unix 系统。我也会尝试为 Windows 找到一些东西。
    【解决方案2】:

    这是关于“make install”的一个非常常见的问题。实际上,有 3 种方法可以将库链接到可执行文件。首先,您可以在简单的情况下使用-l -L 标志。正如本杰明所说,您可以使用 LD_LIRARY_PATH 并编写如下内容:export LD_LIBRARY_PATH=/usr/local/my_lib。其实这不是一个好办法。使用 RPATH 会更好。有一个very useful doc page about it。看看这个。好吧,如果您在顶级 CMakeLists.txt 中编写类似的内容,它将解决问题:

    SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
    SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")
    SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")
    

    【讨论】:

    • 不,不是。这是关于 cmake 和 ld 路径的一个非常具体的问题。你的答案也没有很好的格式,也没有描述它为什么起作用。请不要只链接到其他地方的答案,还要总结相关部分。
    【解决方案3】:

    通过追加新路径,将包含库的目录的路径添加到 LD_LIBRARY_PATH 环境变量:

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/the/library/
    

    您可以使用“ldd”工具检查是否正确找到了库:

    lld ./executable
    

    如果该库未声明为“未找到”,则可以,您的可执行文件将正确执行。

    将“导出”命令添加到您的 bashrc 以在每次系统重新启动后正确设置 LD_LIBRARY_PATH 变量,否则您将不得不再次执行“导出”命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2016-01-08
      • 1970-01-01
      • 2015-10-03
      • 2015-10-08
      相关资源
      最近更新 更多