Linux学习实验-----库文件的创建与时使用 实验一

一 实验题目:

库文件的创建与时使用实验

二 实验目的

掌握库文件工作的原理,库文件的创建和使用方法

三 实验内容

1、概述

2、编写最简单的静态库文件

3、制作库文件

4、使用库文件

5、动态库的编写

6、编译生成动态库 ,库文件名以lib开头,以.so 结尾。

7、动态库的隐式调用

四 实验步骤

1、概述

静态库文件的扩展名一般为.a,其编写步骤很简单。

⑴ 编写函数代码

⑵ 编译生成各目标文件

⑶ 用ar文件对目标文件归档,生成静态库文件。

  注意归档文件名必须以lib打头。

使用要点:

⑴ 在gcc 的-I参数后加上静态库头文件的路径。

⑵ 在gcc 的-L参数后加上库文件所在目录

⑶ 在gcc 的-l参数后加上库文件名,但是要去掉lib和.a扩展名。

  比如库文件名是libtest.a 那么参数就是 -l test

2、编写最简单的静态库文件

编写如下两个文件,注意放在同一目录中
myalib.h //静态库头文件
myalib.c //静态库实现文件
//myalib.h 文件的内容
void test();
//myalib.c 文件的内容
#inlcude <stdio.h>
void test()
{
printf(“test\n”);
}

3、制作库文件

⑴生成目标文件

执行完后会生成一个myalib.o文件

⑵用ar命令归档,格式为ar -rc <生成的档案文件名> <.o文件名列表

再次提醒,归档文件名一定要以lib打头 .a结尾。
执行完后会生成一个libtest.a文件

4、使用库文件

⑴编写一个测试程序main.c,内容为

//main.c 测试静态库调用的程序
#include “myalib.h” //要把函数的头文件包含进来,否则编译时会报错
int main(int argc,char* argv[])
{
test();
return 0;
}

⑵编译目标文件,注意要把静态库头文件的路径加到-I参数里面

现在生成了一个main.o文件
生成可执行文件,注意要把静态库文件的路径加到-L参数里面,把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面。
Gcc -o main main.c libtestlib.a
此时就会生成一个名为main的可执行文件,另外,注意- l参数好象应该加到输入文件名的后面,否则会报错。
比如gcc -o main -L/root/exercise -ltest main.o就会提示
main.o(.text+0x11): In function main': : undefined reference to test’
collect2: ld returned 1 exit status

⑷执行可执行文件查看效果

4、动态库的编写

为了便于对照, 我们仍然采用静态库中的文件做例子.
编写如下两个文件,注意放在同一目录中
myalib.h //静态库头文件
myalib.c //静态库实现文件
//myalib.h 文件的内容
void test();
//myalib.c 文件的内容
#inlcude <stdio.h>
void test()
{
printf(“test\n”);
}

5、编译生成动态库 ,库文件名以lib开头,以.so 结尾。

此时就生成一个libtest.so文件

6、动态库的隐式调用

隐式调用的含义是代码里不出现库文件名,就是说这个代码和调用静态库的代码是类似的。

(1) 编写测试文件

//main.c 测试动态库隐式调用的程序
#include “myalib.h” //要把函数的头文件包含进来,否则编译时会报错
int main(int argc,char* argv[])
{
test();
return 0;
}

(2) 编译测试程序,与静态库类似,要把头文件的路径加到-I参数里面

现在生成了一个main.o文件

(3) 连接生成测试程序

现在生成了一个main文件

(4) 执行测试程序

此时出现提示
./main: error while loading shared libraries: libtest.so: cannot open shared object file: No uch file or directory。
这个原因就是程序运行时并不知道动态库所在的路径,因此自然找不到。
查阅资料并尝试解决这个问题的办法。

五 实验结果

2.在这里插入图片描述
3
在这里插入图片描述
在这里插入图片描述
4.
在这里插入图片描述
在这里插入图片描述
5.
在这里插入图片描述

六、总结

想要用好gcc编译命令,就要知道gcc命令的一些常用参数、gcc的参数解析机制、gcc库连接目录以及动态库和静态库的问题,了解各条语句的作用才能更好的讲gcc语句理解。

上面都为作者实际操作中的屏幕截图,有疑问可以讨论_

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值