• GCC -l选项:手动添加链接库


    链接器把多个二进制的目标文件object file)链接成一个单独的可执行文件。在链接过程中,它必须把符号(变量名、函数名等一些列标识符)用对应的数据的内存地址(变量地址、函数地址等)替代,以完成程序中多个模块的外部引用。
    
    而且,链接器也必须将程序中所用到的所有C标准库函数加入其中。对于链接器而言,链接库不过是一个具有许多目标文件的集合,它们在一个文件中以方便处理。
    当把程序链接到一个链接库时,只会链接程序所用到的函数的目标文件。在已编译的目标文件之外,如果创建自己的链接库,可以使用 ar 命令。
    标准库的大部分函数通常放在文件 libc.a 中(文件名后缀.a代表“achieve”,译为“获取”),或者放在用于共享的动态链接文件 libc.so 中(文件名后缀.so代表“share object”,译为“共享对象”)。这些链接库一般位于 /lib/ 或 /usr/lib/,或者位于 GCC 默认搜索的其他目录。
    
    当使用 GCC 编译和链接程序时,GCC 默认会链接 libc.a 或者 libc.so,但是对于其他的库(例如非标准库、第三方库等),就需要手动添加。
    
    令人惊讶的是,标准头文件 <math.h> 对应的数学库默认也不会被链接,如果没有手动将它添加进来,就会发生函数未定义错误。
    
    GCC 的-l选项可以让我们手动添加链接库。下面我们编写一个数学程序 main.c,并使用到了 cos() 函数,它位于 <math.h> 头文件。
    #include <stdio.h>      /* printf */
    #include <math.h>       /* cos */
    #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.
    ", param, result );
        return 0;
    }
    为了编译这个 main.c,必须使用-l选项,以链接数学库:
    $ gcc main.c -o main.out -lm
    
    数学库的文件名是 libm.a。前缀lib和后缀.a是标准的,m是基本名称,GCC 会在-l选项后紧跟着的基本名称的基础上自动添加这些前缀、后缀,本例中,基本名称为 m。
    在支持动态链接的系统上,GCC 自动使用在 Darwin 上的共享链接库 libm.so 或 libm.dylib。
    链接其它目录中的库 通常,GCC 会自动在标准库目录中搜索文件,例如
    /usr/lib,如果想链接其它目录中的库,就得特别指明。有三种方式可以链接在 GCC 搜索路径以外的链接库,下面我们分别讲解。
    1) 把链接库作为一般的目标文件,为 GCC 指定该链接库的完整路径与文件名。 例如,如果链接库名为 libm.a,并且位于 /usr/lib 目录,那么下面的命令会让 GCC 编译 main.c,然后将 libm.a 链接到 main.o: $ gcc main.c -o main.out /usr/lib/libm.a 2) 使用-L选项,为 GCC 增加另一个搜索链接库的目录: $ gcc main.c -o main.out -L/usr/lib -lm 可以使用多个-L选项,或者在一个-L选项内使用冒号分割的路径列表。 3) 把包括所需链接库的目录加到环境变量 LIBRARYPATH 中。
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    布隆去重
    正则匹配
    js常见类型变量的遍历
    汉印MT800 win10电脑蓝牙打印驱动设置
    [Tips] 基于ohmyzsh安装powerlevel10k
    加载加密sqlite到内存
    使用Jmeter 压力测试
    vue实现为页面加水印
    【对象存储】minio集群部署
    StringGrid单元格绑定ComboBox、DateTimePicker或窗口传值
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/11813763.html
Copyright © 2020-2023  润新知