我使用CMake(2.8)
构建了一个共享库和一个测试应用程序现在,在make install
之后,我得到了这样一棵树:
root/
lib/
mylib.so
samples/
test1
test2
...
现在,当我运行test
应用时,它无法找到要运行的共享库文件:
error while loading shared libraries: mylib.so: cannot open shared object file: No such file or directory
我该如何解决这个问题?
修改
以下是我的CMakeLists.txt的相关部分
对于mylib
add_library(mylib SHARED ${LIB_SOURCES})
target_link_libraries(mylib ${VTK_LIBRARIES} ${OpenCV_LIBS})
install(TARGETS mylib DESTINATION lib)
install(FILES include/mylib.h DESTINATION include)
install(DIRECTORY models DESTINATION .)
add_subdirectory(samples)
对于可执行文件夹:
file(GLOB APP_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
foreach( samplesourcefile ${APP_SOURCES} )
string( REPLACE ".cpp" "" samplename ${samplesourcefile} )
add_executable( ${samplename} ${samplesourcefile} )
target_link_libraries( ${samplename} mylib )
install(TARGETS ${samplename} DESTINATION samples)
endforeach( samplesourcefile )
答案 0 :(得分:0)
这可能是因为您的库安装在Linux操作系统的非默认目录中。
文件/etc/ld.so.conf包含动态加载程序用于在Linux中搜索共享库的目录,请参阅ldconfig
联机帮助页。
您始终可以使用命令ldd
检查是否找到了动态链接可执行文件(如测试应用程序)的所有共享依赖项。
因此,解决缺少库问题的方法是将库安装在系统用作查找共享库的搜索路径的目录下。
在Linux发行版中安装开发共享库的适当位置是/usr/local/lib
;在所有Linux中,默认情况下,这几乎肯定包含在共享库的搜索路径中。同样,像你的测试应用程序这样的开发二进制文件最好放在/usr/local/bin
下(但是在其他地方使用它不是导致lib缺失的原因)。
有关记录的信息,请参阅The Linux Documentation Project记录的/usr/local
摘录:
[...]它复制'/ usr'的结构。这些天,'/ usr / local'是 被广泛认为是一个值得留住的好地方 自编或第三方程序。 / usr / local层次结构适用于 在本地安装软件时由系统管理员使用。它 在系统软件安装时需要保护不被覆盖 更新。它可以用于可共享的程序和数据 在一组主机中,但在/ usr中找不到。本地安装 软件必须放在/ usr / local而不是/ usr中,除非它 正在安装以替换或升级/ usr中的软件。