linker
用法:
用法:ld [选项] 文件1 文件2 ...
最常用的两个选项
-l 库名, --library 库名 搜索库“库名”
-L 目录, --library-path 目录
将“目录”添加到库搜索路径中
ld的搜索路径
ld默认是没有任何搜索路径的,ld解析依赖关系是主要是通过下面几个因素决定的
- 通过ld选项
-l -L
指定的库文件或者路径 - 通过
ld.so
,注意ld.so
不是ld
- 环境变量
LD_LIBRARY_PATH
指定的路径
其中ld.so
是主要的解析依赖关系的组件,ld.so
搜索的路径主要是以下几个方面(顺序从上到下)
DT_RPATH
和DT_RUNPATH
指定的路径,这是二进制可执行文件中直接包含的路径(通过-Wl,-rpath
和-Wl,-runpath
选项指定),比如下面的例子是编译的时候为*.o
文件指定
gcc -o myprogram myprogram.c -Wl,-rpath,/path/to/shared/libs
DT_RPATH
是旧标记,DT_RUNPATH
是新标记- runtime配置文件
/etc/ld.so.conf
中指定的路径 - linux系统默认的库路径:
/lib
和/usr/lib
以上组成了ld搜索so文件的路径
在qt中,如果没有配置环境变量,那么在qt creator中可以运行的可执行文件,在文件夹中双击就提示缺少库文件,原因在于qt默认在“运行”的时候,通过LD_LIBRARY_PATH
的方式给出了各种库文件的路径:
ld gold lld
常说的ld,约定俗成的被认为是gnu ld
,除此之外还有其他实现的linker,比如gold和lld
他们在linux系统中的名称是ld ld.gold ld.lld
lld是llvm提供的
cmake中可以通过CMAKE_CXX_LINK_EXECUTABLE
和CMAKE_C_LINK_EXECUTABLE
指定gold linker
cmake_minimum_required(VERSION 3.0)
project(MyProject)
# 设置 gold 链接器路径
set(CMAKE_CXX_LINK_EXECUTABLE "/usr/bin/ld.gold")
set(CMAKE_C_LINK_EXECUTABLE "/usr/bin/ld.gold")
# 添加可执行文件
add_executable(my_program main.cpp)
cmake指定搜索路径
cmake_minimum_required(VERSION 3.0)
project(MyProgram)
# 添加可执行文件
add_executable(my_program main.cpp)
# 指定共享库的搜索路径并链接共享库
target_link_libraries(my_program PRIVATE
/path/to/my_library_directory
my_library
)
查看ld.so搜索路径
ldconfig -v -N | grep "^/"
-v
打印所有
-N
只打印不缓存
另外
程序执行的时候也是通过ld.so
加载库文件的
不过程序的当前目录是最高优先级的。
注意:
如果可执行文件a.out依赖的xxx.so和a.out在同级目录,但是xxx.so又依赖yyy.so,但是yyy.so没有在所有的搜索路径中的时候,执行a.out仍然会提示找不到xxx.so
这种情况,补齐所有的so文件即可。