通过ldd命令可以找出可执行文件所使用动态连接库,但是Linux系统是怎样找到这些在不同目录下的库文件的?
首先,Linux采用文件名匹配的方式来确定动态连接库,也就是在库目录中找文件名和所需库一样的文件。
然而这些库文件散落在不同的目录下,所以就需要一个机制来确定搜索哪些目录和搜索的顺序。
有三类方式影响这个规则:系统的配置文件,可执行文件自带的标签,和环境变量。它们直接互相影响,优先级关系见图。
编译时如何设置rpath/runpath?
CMake中设置CMAKE_INSTALL_RPATH 或者对每个项目设置,如
set_target_properties(project_name PROPERTIES INSTALL_RPATH "${RPATH_DIRECTORIES}")
使用rpath还是runpath?
尽量使用runpath,这样运行是可以通过LD_LIBRARY_PATH来控制使用的库。但为什么是尽量?因为runpath不会作用到间接依赖的库,而rpath会。
编译时如何选择rpath或runpath?
通过使用连接器的 –disable-new-dtags 或 –enable-new-dtags 参数
如在CMake中使用
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags") # use rpath
注意不同版本的gnu-ld 的默认设置不一样,最新版本的默认设置为runpath
如何查看path/runpath?
使用chrpath