C语言 gcc 动态库

动态库编译例子

代码准备

|-- fn
|   |-- add.c
|   `-- sub.c
|-- h
|   `-- head.h
|-- lib
`-- test.c

add.c内容

int add(int a,int b){
        return a+b;
}

sub.c内容

int sub(int a,int b){
        return a-b;
}

test.c内容

#include "head.h"
int main(void)
{
        int a =1, b = 2;
        printf("%d\n",add(a,b));
        printf("%d\n",sub(a,b));
        return 0;
}

head.h内容

#include <stdio.h>
int add(int a,int b);
int sub(int a,int b);
  1. 编译函数库(前三部),相较于静态库,-fpic参数,声明这个库是与内存里的位置无关的
    gcc -fpic -c ./fn/*.c -I ./h/

  2. 编译动态库,使用-share参数,gcc -shared -o ./lib/lib输出库名.so 要编译链接的库名
    动态库的命名必须以lib开头以.so结尾(动态库命名规则)
    gcc -shared -o ./lib/libcalc.so *.o

  3. 编译整个工程文件
    默认gcc会找标准库,自己的库需要指明,-L指定库的目录,-l指定库的名称.库名会省略掉lib和.a
    gcc test.c -o test -I h/ -L lib/ -l calc

其他

在执行的时候会
./test: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
ldd用来查看链接
会发现动态库找不到目录
这时因为没有找到动态库的路径,有三种方法解决:

1.放在系统默认库
1)1)找到动态库所在路径: sudo find / -name [动态库]
2)系统里/lib/usr/lib是存放库的目录,可以建立一个软连接放进去
sudo ln -s $PWD/lib/libcalc.so /lib/libcalc.so

2.设置环境变量
LD_LIBRARY_PATH

1)找到动态库所在路径: sudo find / -name [动态库]
2)打开.bashrc或者~/.bash_profile文件
3)export LD_LIBRARY_PATH=xxx:$LD_LIBRARY_PATH//一次设置有效,永久有效放在.bashrc

3.设置LD加载文件
/etc/ld.so.conf文件记录了程序加载运行期间查找动态库连接时的路径
1)找到动态库所在路径: sudo find / -name [动态库]
2)sudo vi /etc/ld.so.conf
3)在最后一行添加动态库的绝对路径
4)重新加载配置文件:sudo ldconfig -v

参考:
http://www.360doc.com/content/19/0503/16/99071_833102506.shtml
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值