Linux系统编程 26 静态库的制作

Linux系统编程 26 静态库的制作

学习笔记

lib的好处:
1.不会以代码的形式存在
2.省去编译的过程,节省时间

制作静态库的方法
:借助ar工具

格式:ar rcs  libxxx.a xx1.o xx2.o
ar rcs lib静态库名.a 要使用的原材料目标文件


参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,
并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
参数c:创建一个库。不管库是否存在,都将创建。 
参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果。a文件缺少索引,可以使用ranlib命令添加)
参数r 还要进一步理解

静态库制作步骤:
1.将.c 生成 .o
gcc -c ***.c -o ***.o
2.使用ar工具制作静态库
ar rcs lib静态库名.a 要使用的原材料目标文件
静态库名字:一般直接叫***库文件
3.编译静态库到可执行文件中去
gcc ***.c lib***.a -o ***.out


$mkdir staticlib
$ls
file  file2  hello  hello.c  inc  staticlib
$cd staticlib/
$ls
$vi add.c
$ls
add.c  div1.c  sub.c
$gcc -c add.c -o add.o
$gcc -c div1.c -o div1.o
$gcc -c sub.c -o sub.o
$ls
add.c  add.o  div1.c  div1.o  sub.c  sub.o
$ar rcs libmymath.a add.o div1.o sub.o
$ls
add.c  add.o  div1.c  div1.o  libmymath.a  sub.c  sub.o

libmymath.a: current ar archive

$cat add.c
int add(int a,int b)
{
    return (a+b);
}


$cat div1.c
int div1(int a, int b)
{
    return (a/b);
}


$cat sub.c
int sub(int a, int b)
{
    return (a-b);
}


$mkdir resource
$ls
add.c  add.o  div1.c  div1.o  libmymath.a  resource  sub.c  sub.o
$mv ./*.o ./resource/
$mv ./*.c ./resource/
$ls
libmymath.a  resource


$vi test.c
$gcc -c test.c -o test.o
$ls
libmymath.a  resource  test.c  test.o
$gcc  test.c -o test.o
/tmp/cc4rWoN4.o: In function `main':
test.c:(.text+0x2d): undefined reference to `add'
test.c:(.text+0x5a): undefined reference to `sub'
test.c:(.text+0x87): undefined reference to `div1'
collect2: error: ld returned 1 exit status
出错地方是链接,不是编译错误,如果是编译出错,会有行号
链接阶段是二进制文件,所以没有行号

collect2:链接器
ld 驱动链接器去工作


test.c 内容:
#include <stdio.h>

int main(int argc, char *argv[])
{
    int a=4,b=6;

    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,div1(a,b));

}


使用静态库

$
$gcc test.c ./libmymath.a  -o test.out
$^C
$ll
total 32
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec  8 12:54 ./
drwxrwxrwx 4 root   root   4096 Dec  8 12:35 ../
-rw-rw-r-- 1 ubuntu ubuntu 3982 Dec  8 12:39 libmymath.a
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec  8 12:45 resource/
-rw-rw-r-- 1 ubuntu ubuntu  703 Dec  8 12:50 test.c
-rwxrwxr-x 1 ubuntu ubuntu 8696 Dec  8 12:54 test.out*   
$cd resource
$ll
total 32
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec  8 12:45 ./
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec  8 12:54 ../
-rw-rw-r-- 1 ubuntu ubuntu  552 Dec  8 12:37 add.c
-rw-rw-r-- 1 ubuntu ubuntu 1232 Dec  8 12:38 add.o
-rw-rw-r-- 1 ubuntu ubuntu  554 Dec  8 12:37 div1.c
-rw-rw-r-- 1 ubuntu ubuntu 1232 Dec  8 12:39 div1.o
-rw-rw-r-- 1 ubuntu ubuntu  553 Dec  8 12:37 sub.c
-rw-rw-r-- 1 ubuntu ubuntu 1240 Dec  8 12:39 sub.o


$gcc -c test.c -o test.o
$ls
libmymath.a  resource  test.c  test.o  test.out
$ll
total 36
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec  8 12:56 ./
drwxrwxrwx 4 root   root   4096 Dec  8 12:35 ../
-rw-rw-r-- 1 ubuntu ubuntu 3982 Dec  8 12:39 libmymath.a
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec  8 12:45 resource/
-rw-rw-r-- 1 ubuntu ubuntu  703 Dec  8 12:50 test.c
-rw-rw-r-- 1 ubuntu ubuntu 1912 Dec  8 12:56 test.o
-rwxrwxr-x 1 ubuntu ubuntu 8696 Dec  8 12:54 test.out*

test.out 比 test.o 要大


执行
$./test.out
4+6=-2011355806
4-6=-2
4/6=0
$

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值