/usr/bin/ld
命令是 GNU 链接器 (GNU Linker),通常简称为 ld
。它是 Linux 系统中非常重要的一个工具,主要用于将编译生成的各种目标文件(Object Files)和库文件(Libraries)组合成一个可执行文件(Executable File)、共享库(Shared Library)或静态库(Static Library)。
介绍
以下是关于 /usr/bin/ld
命令的一些作用:
-
链接器的作用 (Function of the Linker):
- 合并文件 (Merging Files): 将一个或多个目标文件(由编译器如 GCC 生成,通常以
.o
结尾)合并在一起。
- 解析外部引用 (Resolving External References): 程序中的函数调用或变量引用可能定义在不同的目标文件或库文件中。链接器负责找到这些引用的实际定义位置,并将它们正确地连接起来。
- 地址分配 (Address Assignment): 为程序中的代码和数据分配内存地址。
- 生成最终输出 (Generating Final Output): 默认情况下,它会生成一个名为
a.out
的可执行文件(除非使用 -o
选项指定了不同的文件名)。
-
通常的使用方式 (Typical Usage):
- 虽然可以直接调用
ld
,但在日常编程中,我们通常通过 GCC 或其他编译器的前端来间接调用 ld
。例如,当你运行 gcc program.c -o program
时,GCC 会在编译和汇编之后,自动调用 ld
来完成链接工作。
-
核心选项 (Core Options):
-o <outputfile>
: 指定输出文件的名称(例如,可执行文件或库文件)。
-l<library>
: 链接指定的库。例如,-lm
用于链接数学库 libm.a
或 libm.so
。
-L<directory>
: 添加一个目录到链接器搜索库文件的路径列表。
<inputfile(s)>
: 要链接的目标文件(.o
文件)或库文件。
-
链接类型 (Linking Types):
- 静态链接 (Static Linking): 将库中的代码完整地复制到最终的可执行文件中。
- 动态链接/共享链接 (Dynamic Linking/Shared Linking): 可执行文件只包含对共享库(
.so
文件)的引用。程序运行时才加载和使用共享库。这是 Linux 系统中最常见的链接方式。
总之,/usr/bin/ld
是 将零散的代码和数据片段整合成一个可运行程序的幕后英雄。
F&Q
/usr/bin/ld: cannot find -lXXX
# locate 查找库文件
locate libXXX.so
# apt-file 搜索提供该文件的包
sudo apt-get install apt-file
apt-file update
apt-file search libXXX.so
# ubuntu 到官网查找文件的包
https://packages.ubuntu.com/
# 安装对应的包,若软连接不对,则创建链接
sudo ln -s /usr/local/xxxx/libXXX.so /usr/lib/libXXX.so