我之前已经做了好几次,但不知怎的,这次我已经陷入了困境。我有一个可执行文件" 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%有效。
有谁知道我做错了什么?
答案 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变量,否则您将不得不再次执行“导出”命令。