linux中的库

一、什么是库?

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)

库是一种可执行的二进制形式、就是将源代码转化为二进制格式,相当于进行了加密,别人可以使用库,但是看不到库中的内容。

二、如何制作并使用静态库?

a. 静态库的制作和使用

(1)命名的规则

静态库文件名的命名方式是“libxxxxx.a”,库名前加“lib”,后缀用“.a”,“xxxxx”为静态库的真实名字

(2)制作的步骤

原材料:.c或.cpp文件

a. 首先将.c文件生成.o文件,通过 gcc xxxx.c -c 生成.o文件

b. 将.o文件进行打包成后缀为.a的静态库文件

通过 ar rcs libxxx.a xxx.o 的方式进行打包。

(3)静态库的使用

gcc jsq.c -ltestjsq -L ./ -o main

-l(小写的L):指定要用的静态库,库名要看头去尾(即要去掉lib和后缀.a)

-L(大写的L):告诉gcc编译器从-L指定的路径去找静态库,如果没有指定,则默认从/usr/lib或/usr/local/lib去找 ,则这里有指定./,-L ./的意思就是从当前路径去找

-o(小写的O):指定生成的可执行文件

运行:直接像我们平时运行一样./main

例子:

jsq.c文件

#include<stdio.h>
#include "jsqGNeng.h"
int main()
{
        int a;
        int b;
        int ret;
        float ret1;
        printf("请输入第一个数\n");
        scanf("%d",&a);
        printf("请输入第二个数\n");
        scanf("%d",&b);
        printf("开始计算\n");

        ret = add(a,b);
        printf("相加为%d\n",ret);
        ret = min(a,b);
        printf("相减为%d\n",ret);
        ret = mul(a,b);
        printf("相乘为%d\n",ret);
        ret1 = div(a,b);
        printf("相除为%f\n",ret1);

        return 0;
}

jsqGNeng.c

int add(int a,int b)
{
    return a+b;
}
int min(int a,int b)
{
    return a-b;
}
int mul(int a,int b)
{
    return a*b;
}
float div(int a,int b)
{
    return (float)a/b;
}

jsqGNeng.h

int add(int a,int b);
int min(int a,int b);
int mul(int a,int b);
float div(int a,int b);

这样就生成静态库文件libtestjsq.a

给别人时提供libtestjsq.a 和相关头文件、主函数

三、如何制作并使用动态库?

(1)命名的规则

动态库文件名的命名方式是“libxxxxx.so”,库名前加“lib”,后缀用“.so”,“xxxxx”为动态库的真实名字。

(2)制作的步骤

-shared 指定生成动态库

gcc -shared -fpic xxx.c -o libxxx.so

(3)动态库的使用

因为动态函数库是在程序执行时动态(临时)由目标程序去调用,所以找不到这个库,默认会在/usr/lib/里面找。

那么引用动态库,怎么指定动态库的位置?

指定动态库位置的方法

本次用了文中的方法二

这个只是临时的,如果换了个窗口依然不能运行。

解决方法:写个脚本

chmod +x xxxx代表给xxxx给予一个可执行权限

四、静态库和动态库的区别

静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;

优点: 1.运行快2.发布程序无需提供静态库,因为已经在app中,移植方便

缺点:1.程序大2.更新部署发布麻烦

动态函数库,是在程序执行时动态(临时)由目标程序去调用

优点:1. 程序小、节省内存2.升级简单。

缺点: 1.运行慢2.需要提供依赖的动态库。

学习笔记,仅供参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值