gcc 静态库和动态库的生成与使用用

链接是编译的最后一个步骤

静态链接

  1. 文件大
  2. 更新需要重新编译整个工程

动态链接

  1. 运行是才加载资源

  2. 体积小

  3. 依赖于动态库,版本问题比较严重

动态编译

gcc hello.c -o hello-share

默认使用动态链接

静态编译

gcc -static hello.c -o hello-static

制作静态库

库名: libxxx。a

  1. 先成一个目标代码

    gcc -c add.c -o add.o
    gcc -c sub.c -o sub.o
    gcc -c mul.c -o mul.o
    gcc -c div.c -o div.o
    
  2. 打包生成静态库

    ar -rsc libtest.a add.o sub.o mul.o div.o
    

    -r 更新

    -c 创建

    -s 建立索引

  3. 测试静态库

    gcc test.c -I./ -L./ -ltest  -o test.out
    

    -I inclide目录

    -L 静态库的目录

    -l 静态库的文件(不包含lit和结尾的.a)

    静态库使用时需要 libxxx.a 和相应的头文件

动态库的制和使用

名称:libxxx.so

  1. 生成位置无关码

    gcc -fpic -c div.c
    gcc -fpic -c add.c
    gcc -fpic -c sub.c
    gcc -fpic -c mul.c
    
  2. 生成共享库

    gcc -shared add.o div.o sub.o mul.o -o libtest.so
    
  3. 编译测试

    gcc test.c -L. -I. -ltest -o test.out
    
  4. 执行

    ./test.out
    error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
    

    没有找到libtest.so

  5. 让程序可以找到 libtetst.so文件

    cp ./libtetst.so /lib # 不推荐
    

    复制到/lib目录之后,编译时就可以不用再指定 -L选项了

    gcc test.c -I. -ltest -o aa.out
    ./aa.out
    

    可以正常执行了

    临时设置环境变量

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径
    

    把这个代码加到 ~/…bashrc中

    vi ~/.bashrc
    # 最后一行加入
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径
    source ~/.bashrc 
    

    修改ld配置文件

    sudo vi /etc/ld.so.config
    # 在文件件最后添加动态链接库的绝对路径
    sudo ldconfig # 使配置生效
    

使用符号链接

sudo ln -s 目标库绝对路径 /lib/libxx.so
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值