1 GCC的-l选项,手动添加链接库

GCC在编译代码时,可以使用-l手动添加链接库,比如说有以下代码main.c

#include <stdio.h>
#include <math.h>
#define PI 3.14159265
int main ()
{
    double param, result;
    param = 60.0;
    result = cos ( param * PI / 180.0 );
    printf ("The cosine of %f degrees is %f.\n", param, result );
    return 0;
}

直接使用gcc编译会出现cos未定义的链接错误,无法找到cos这个函数

gcc main.c

#出现以下错误
/tmp/ccYfkZJk.o: In function `main':
main.c:(.text+0x34): undefined reference to `cos'
collect2: ld returned 1 exit status

标准头库文件math.h对应的数学库默认也不会被链接,如果没有手动将它添加进来,就会发生函数未定义错误。

对于上述问题,必须手动链接数学库m,修改编译命令如下

gcc main.c -o main.out -lm

数学库的文件名是libm.a,前缀lib和后缀.a是标准的,m是数学库的名称,GCC 会在-l选项后紧跟着的基本名称的基础上自动添加这些前缀、后缀,本例中,基本名称为 m。

2 GCC中常用手动链接选项-lz-lrt、-lm、-lc-lpthread-lcryptdl链接都是什么库?

  1. -lz:手动链接压缩库libz
  2. -lrt:手动链接实时库librt。这个库包括异步I / O,消息队列,进程调度,实时信号扩展,信号量,共享内存对象,同步I / O和定时器选项下定义的接口。
  3. -lm:手动链接数学库libm,libm库是Linux系统中的一种数学库文件,它提供了各种数学函数,例如三角函数、指数函数、对数函数以及一些高级数学函数等等。
  4. -lc:手动链接标准c库libc,libc库是Linux系统中最基础的库文件,它包含了各种C语言库函数以及一些系统级的API。这个库文件提供了Linux系统中最常用的函数,例如字符串操作、IO操作、数学函数等等,也是其他库文件的基础。
  5. -lpthread:手动链接多线程库pthread,用到多线程需要链接,包括在linux上使用std::thread也需要链接。libpthread库是Linux系统中的线程库文件,它提供了各种线程相关的API函数。使用这个库可以在Linux系统中创建多线程程序,实现程序并发执行,提高程序运行效率。
  6. -lcrypt:手动链接加密库libcrypt。libcrypt库是Linux系统中的一个加密库文件,可以提供各种加密算法,例如DES、SHA等等。使用这个库可以实现对数据的加密和解密,保证数据的安全性。
  7. dl:显式加载动态库的