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_RPATHDT_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_EXECUTABLECMAKE_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文件即可。

posted @ 2023-08-21 20:24  feipeng8848  阅读(27)  评论(0编辑  收藏  举报