Cmake:链接共享库

问题描述 投票:0回答:3

我之前已经这样做过几次了,但不知何故,这次我陷入了困境。我有一个可执行文件“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
3个回答
6
投票

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


2
投票

这是关于“make install”的一个非常常见的问题。实际上,有 3 种方法可以将库链接到可执行文件。首先,您可以在简单的情况下使用

-l -L
标志。正如本杰明所说,您可以使用
LD_LIBRARY_PATH
并写下类似:
export LD_LIBRARY_PATH=/usr/local/my_lib
。其实这并不是一个好办法。使用 RPATH 会好得多。有一个关于它的非常有用的文档页面。一探究竟。好吧,如果你在顶级 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")

0
投票

通过附加新路径,将包含库的目录路径添加到

LD_LIBRARY_PATH
环境变量中:

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

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

lld ./executable

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

将“export”命令添加到您的 bashrc,以便在每次系统重新启动后正确设置

LD_LIBRARY_PATH
变量,否则您将不得不再次执行“export”命令。

© www.soinside.com 2019 - 2024. All rights reserved.