linker

发布时间 2023-08-21 20:31:17作者: feipeng8848

用法:

用法: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文件的路径

ld gold lld

常说的ld,约定俗成的被认为是gnu ld,除此之外还有其他实现的linker,比如gold和lld
他们在linux系统中的名称是ld ld.gold ld.lld
lld是llvm提供的

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
)