Linux的函数库制作

Linux的库

在Linux中,标准的库文件一般存放在/lib和usr/lib的目录中。c语言编译器gcc(更确切的说是链接程序)需要知道要搜索哪些库文件,因为默认情况下,它只搜索标准C语言库。仅仅把库文件放在标准目录中就希望C语言编译器gcc能够找到它是不够的,库文件必须遵循特定的命名规范并且需要在命令行中明确指定。函数库通常以静态库和动态库两种格式存在。

1.静态库

在程序执行前(编译)就加入到目标程序中 。

1.1优缺点

优点:

1.静态库被打包到应用程序中加载速度快。
2.发布程序无需提供静态库,因为已经在执行文件中,移植方便。

缺点:

1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝,浪费内存空间。
2.更新、部署、发布麻烦。

2.2命名规则

静态库文件名的命名方式是**“libxxx.a”**
库名前加“lib”,后缀用“.a”,“xxx”为库名

2.3制作与使用

add.h

#ifndef HELLO_H
#define HELLO_H

void hello(int a,int b);

#endif

add.c

#include <stdio.h>

void add(int a,int b)
{
	int c;
	c =a+b;
    printf("%d+%d=%\n", a,b,c);       
}

main.c

#include<stdio.h>
#include "add.h"
int main(int argc, char * argv[])
{
	int a;
	int b;
    scanf("%d",&a);
    scanf("%d",&b);
    add(a,b);
    return 0;
}

将hello.c编译成静态库文件,步骤如下

  1. 生成“.o”文件:gcc add.c -c
  2. 将“.o”文件打包,生成静态库文件
    ar rcs libadd.a add.o
    ar rcs:静态库打包指令
    libadd.a:静态库名字
    add.o:原材料

静态库的使用
**gcc main.c -ladd -L ./ **

-L:告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib ,/usr/local/lib去找
./:当前路径

gy@ubuntu:~/library$ gcc add.c -c
gy@ubuntu:~/library$ ar rcs libadd.a add.o
gy@ubuntu:~/library$ ls
add.c  add.h  add.o  libadd.a  main.c
gy@ubuntu:~/library$ gcc main.c -ladd -L ./
gy@ubuntu:~/library$ ./a.out 
-------------
input num1:
1
input num2:
2
result:
1+2=3
-------------

2.动态库

在程序执行时动态(临时)由目标程序去调用

2.1优缺点

优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多 个程序可以共用,节省内存。

2.程序升级简单,因为程序里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。

缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库

2.2命名规则

静态库文件名的命名方式是libxxx.so.x.y.z
库名前加“lib”,后缀用“.os”,“xxx”为库名
.x.y.z为主/次/发行版本号

2.3制作与使用

add.h

#ifndef HELLO_H
#define HELLO_Hx

void hello(int a,int b);

#endif

add.c

#include <stdio.h>

void add(int a,int b)
{
	int c;
	c =a+b;
    printf("%d+%d=%\n", a,b,c);       
}

main.c

#include<stdio.h>
#include "add.h"
int main(int argc, char * argv[])
{
	int a;
	int b;
    scanf("%d",&a);
    scanf("%d",&b);
    add(a,b);
    return 0;
}

将hello.c编译成动态库文件,步骤如下

  1. 生成“.o”文件:gcc add.c -c
  2. 将“.o”文件打包
    gcc -shared -fpic add.o -o libadd.so
    -shared: 指定生成动态库
    -fpic: 生成位置无关的代码(标准)
    libadd.os:动态库名字

动态库的使用
gcc main.c -I /usr/include -ladd -L ./
-L:-告诉gcc编译器从-L制定的路径去找动态库。默认是从/usr/lib /usr/local/lib去找
./:当前路径
linux动态库(.so)搜索路径(目录)设置方法

  1. cp libadd.os /usr/lib
  2. export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH(shell关闭后失效)
gy@ubuntu:~/library$ gcc add.c -c
gy@ubuntu:~/library$ gcc -shared -fpic add.o -o libadd.so
gy@ubuntu:~/library$ ls
add.c  add.h  add.o  a.out  libadd.so  main.c
gy@ubuntu:~/library$ ./a.out 
./a.out: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
gy@ubuntu:~/library$ export LD_LIBRARY_PATH=/home/gy/library:$LD_LIBRARY_PATH
gy@ubuntu:~/library$ ./a.out 
-------------
input num1:
1
input num2:
1
result:
1+1=2
-------------

  1. 长期的使用可以建立一个.sh文件
gy@ubuntu:~/library$ vi open.sh
     export LD_LIBRARY_PATH=/home/gy/library:$LD_LIBRARY_PATH
    ./a.out
gy@ubuntu:~/library$ sh open.sh 
-------------
input num1:

参考链接:

https://www.cnblogs.com/progamming/p/13043652.html
https://www.cnblogs.com/sunsky303/p/7731911.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值