gcc 编译链接初探

文章详细介绍了GCC的编译链接过程,包括静态链接与动态链接的区别。静态链接将库内容加入到可执行程序,而动态链接在运行时加载。制作静态库涉及ar工具,动态库则需-fpic编译选项和-shared链接选项。动态库的使用可能需要设置LD_LIBRARY_PATH或创建符号链接。
摘要由CSDN通过智能技术生成

gcc 编译链接过程

1、gcc 编译链接过程:

在这里插入图片描述

2、静态链接与动态链接:

  • 静态链接:链接器在链接时将库的内容加到可执行程序中。

  • 动态链接:链接器在链接时仅建立与所需库函数之间的链接关系,在程序运行时才将所需资源调入可执行程序中。

  • 静态、动态编译:

    • 程序默认情况是动态编译。

    • 静态编译需要加入参数 -static

    • // 动态编译:
      gcc main.c -o test_share
      // 静态编译:
      gcc -static main.c -o test_static
      

3、静态库制作与使用:

  • 静态库是一些目标代码(*.o)的集合,是在可执行程序运行前就加入到执行码中,成为执行码的一部分。

  • 静态库以".a"作为文件后缀,“lib”作为前缀,中间是静态库名字。最终名字是 libxxx.a

  • 静态库制作:

在这里插入图片描述

  • 第一步: 将各种.c源文件和头文件(.h)直接编译成目标文件(.o)。

    gcc -c add.c -o add.o
    gcc -c sub.c -o sub.o
    

    第二步:使用程序 ar 将目标文件(*.o)打包成 .a 的静态库文件 libxxx.a

    ar -rcs libtest.a add.o sub.o
    # 参数:r更新; c: 创建;s:创建索引
    
  • 静态库的使用:

    • 静态库制作完成后需要将其.a文件和头文件.h一起发给用户使用。

    • gcc test.c -L./ -I./ -ltest -o libtest
      # 参数: -L: 要链接的库所在的目录;
      # -I: 指定头文件的目录;
      # -l(小写L):指定链接所需的库,去掉前后缀。
      

在这里插入图片描述

4、动态库的制作与使用:

  • 共享库在程序编译时不会被链接到目标代码中,在程序运行时才被载入。不同程序调用相同的库,只需在内存中存有一份共享库即可。

  • 一般以后缀".so"命名, 前缀为"lib",所以共享库一般命名为“libxxx.so"

  • 动态库的制作:

    • 第一步:将源文件.c 编译成目标文件 ,需要加编译选项 -fpic(position independent code), -c

      gcc -fpic -c add.c
      gcc -fpic -c sub.c
      # 参数:-fpic创建与地址无关的编译程序,为了能够在多个应用程序间共享。
      

      第二步:生成共享库,需要加链接器选项 -shared(指定生成动态链接库)

      gcc -shared add.o sub.o -o libtest.so
      

      第三步:通过 nm 命令查看对应的函数:

      nm libtest.so | grep "add"
      
  • 通过命令ldd可以查看可执行文件依赖的动态库。

  • ldd prog
    
  • 动态库的测试:

    • 动态库制作完成后,引用动态库编译成可执行文件:

    • gcc test.c -L./ -I./ -ltest
      
      • ./a.out后发现报错,找不到对应库文件。
    • 如何让系统找到动态库?

      • 拷贝自己制作的共享库到/lib或者/usr/lib中

      • 临时设置LD_LIBRARY_PATH:

        • export LD_LIBRARY_PATH=$LD_LIBRARY:库路径(绝对路径)
          
      • 使用符号链接,一定使用绝对路径:

        • sudo ln -s 库路径(绝对路径) /lib/libtest.so
          

在这里插入图片描述

参考:

静态链接库与动态链接库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值