Cmake:链接共享库

时间:2012-01-16 13:38:40

标签: static cmake libraries shared

我之前已经做了好几次,但不知怎的,这次我已经陷入了困境。我有一个可执行文件" myapp"和一个自己的共享库" mylib"。在我的电子摄影师中,我有以下内容:

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%有效。

有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

这是一个关于“make install”的常见问题。实际上,有3种方法可以将库链接到可执行文件。首先,您可以在简单的情况下使用-l -L标志。正如本杰明所说,你可以使用LD_LIRARY_PATH并编写类似:export LD_LIBRARY_PATH=/usr/local/my_lib的内容。事实上,这不是一个好方法。使用RPATH会好得多。有一个关于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")

答案 2 :(得分:0)

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

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

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

lld ./executable

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

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