库文件的创建与时使用实验
一 实验题目:
库文件的创建与时使用实验
二 实验目的
掌握库文件工作的原理,库文件的创建和使用方法
三 实验内容
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语句理解。
上面都为作者实际操作中的屏幕截图,有疑问可以讨论_