Linux下静态库学习笔记

Linux下静态库学习笔记
1.什么是库
1-1.库是一种软件组件技术,库里面封装了数据和函数。
库的使用可以使程序模块化。
Linux通常把库文件存放在/lib或/usr/lib目录下。用户创建的可以放在/usr/local/lib目录下。
win32平台下,静态库通常后缀为.lib,动态库为.dll。
Linux平台下,静态库通常后缀为.a,动态库为.so。
在程序中使用静态库和动态库时,载入顺序是不同的:静态库的代码在编译时就拷贝到应用程序中,动态库为程序在开始运行后调用库函数时才被载入。
1-2.静态库与动态库的区别
1-2-1.利用静态库编译成的文件(空间)比较大,因为整个函数库的所有数据都会被整合进目标代码中,动态库在编译的时候并没有被编译进目标代码中,因此动态库所产生的可执行文件比较小;
1-2-2.静态库在编译后的执行程序不在需要外部函数库的支持,而动态库是程序执行时动态地申请并调用,所以运行环境中必须提供相应的库;
1-2-3.如果静态库被改变,则程序必须重新编译,动态库的改变并不需要重新编译程序,所以动态库在升级和维护上比较方便。
1-2-4.小结:
静态库:占用空间大,效率高,需重编
动态库:占用空间小,效率低,不重编
1-3.静态库的创建和使用
1-3-1.基本步骤:
a.在头文件中声明静态库所导出的函数
b.在源文件中实现静态库所导出的函数
c.编译源文件,生成目标代码文件
d.将目标代码加入到静态库中
e.在程序中使用静态库
1-3-2.ar命令
ar命令用于创建静态库
格式:ar [-rcdtvs] libxxx.a xx1.o xx2.o
选项r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。默认情况下,新的成员增加在库的结尾处,可以使用其他选项来改变增加的位置。
选项c:创建一个库。不管库是否存在,都将创建。
选项d:删除一个模块。
选项t:输出库中包括的目录(模块)。
选项v:显示执行操作选项的详细信息。
选项s:创建目标文件索引,这在创建较大的库时能加快时间。
1-3-3.连接库文件的搜索路径
静态库链接时搜索路径顺序:
a. ld会去找gcc命令中的参数-L
b. 再去找gcc的环境变量LIBRARY_PATH
c. 再去找内定目录/lib /usr/lib /usr/local/lib这是当初compile gcc时写在程序内的
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态库链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态库链接库文件搜索路径

1-4.实例演练
1-4-1.编写一个静态库。
功能:输出一条信息Hello Jllee!
在程序中使用静态库函数。
1-4-1-1.创建头文件head.h

#ifndef HEAD_H
#define HEAD_H

void printMessage();//函数的声明

#endif //HEAD_H
1-4-1-2.创建源文件src.c
#include <stdio.h>
#include "head.h"

int printfMessage()
{
    printf("Hello Jllee!\n");
}

1-4-1-3.编译源文件src.c,生成目标代码src.o
gcc -c src.c
1-4-1-4.使用ar命令通过目标代码src.o生成静态库libprintf.a
ar -rscv libprintf.a src.o
PS查看库包含什么模块:ar -t libprintf.a
1-4-1-5.编写程序main.c,使用静态库函数

#include <stdio.h>
#include "head.h"

int main()
{
    printf("This is main function msg.\n");
    printfMessage();//调用静态库函数

    return 0;
}

1-4-1-6.编译程序main.c生成可执行程序test
gcc main.c -L. -lprintf -o test
PS –L.为指定静态库的路径为当前路径 –lprintf为指定程序要用到的库
1-4-1-7.执行:./test
This is main function msg.
Hello Jllee!
1-4-2.多模块例子
1-4-2-1.创建源码add.c

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

1-4-2-2.创建源码sub.c

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

1-4-2-3.创建源码mutify.c

int mutify(int a, int b)
{
    return (a * b);
}

1-4-2-4.创建源码divide.c

#include <stdio.h>

int divide(int a, int b)
{
    if(0 == b)
    {
        printf("err b is 0\n");
        return -1;
    }
    else
        return (a / b);
}

1-4-2-5.生成add.o divide.o mutify.o sub.o然后再生成libmath.a库
a. gcc -c add.c sub.c mutify.c divide.c
b.先加入add.o模块:
ar -r libmath.a add.o
查看libmath.a包含什么模块:
ar -t libmath.a
add.o
c. 再加入divide.o模块:
ar -r libmath.a divide.o
查看libmath.a包含什么模块:
ar -t libmath.a
add.o
divide.o
d. 再加入mutify.o sub.o模块:
ar -r libmath.a mutify.o sub.o
查看libmath.a包含什么模块:
ar -t libmath.a
add.o
divide.o
mutify.o
sub.o
1-4-2-6. 1-4-2-5的操作可以使用通配符一次性生成add.o divide.o mutify.o sub.o跟libmath.a库
gcc -c *.c
ar -r libmath.a *.o
1-4-2-7.编写程序main.c,使用静态库函数

#include <stdio.h>

int add(int , int);
int sub(int , int);
int mutify(int , int);
int divide(int , int);

int main()
{
    int a = 10;
    int b = 2;
    printf("%d + %d = %d\n", a, b, add(a, b));
    printf("%d - %d = %d\n", a, b, sub(a, b));
    printf("%d * %d = %d\n", a, b, mutify(a, b));
    printf("%d / %d = %d\n", a, b, divide(a, b));
    return 0;
}

1-4-2-8.编译程序main.c生成可执行程序test
gcc main.c -o test -L. –lmath
1-4-2-9.执行:./test
10 + 2 = 12
10 - 2 = 8
10 * 2 = 20
10 / 2 = 5
1-4-3.搜索路径方法(gcc main.c -o test -lmath)
1-4-3-1.设置LIBRARY_PATH环境变量的方法(编译时不想要-L.选项)
a.先执行echo LIBRARYPATHLIBRARYPATH= LIBRARY_PATH:.(在当前环境变量的前提下多加.当前目录路径)
如果没有:则LIBRARY_PATH=.(设置当前环境变量为.当前目录路径)
b.设置为环境变量declare -x LIBRARY_PATH=.
或者export LIBRARY_PATH=.:$LIBRARY_PATH
取消环境变量unset LIBRARY_PATH
c.编译gcc main.c -o test -lmath
1-4-3-2.将创建的静态库放在默认的内定的任一目录下
a.拷贝sudo cp libmath.a /usr/local/lib/
b.编译gcc main.c -o test -lmath

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清荣茂多趣味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值