概述
目录
- 第 1 步:编辑生成例子程序 hello.h、hello.c 和 main.c。
- 第 2 步:将 hello.c 编译成.o 文件。
- 第 3 步:由.o 文件创建静态库。
- 第 4 步:在程序中使用静态库。
- 第 5 步:由.o 文件创建动态库文件。
- 第 6 步:在程序中使用动态库。
- 额外任务一:
- 1.用gedit编写x2x.c、x2y.c、main.c、main.h。
- 2.将x2x.c 和x2y.c和main.c 编译成.o文件
- 3.将x2x、x2y目标文件用ar工具生成一个.a静态库文件
- 4.用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,并记录大小
- 额外任务二:
- 1.将x2x、x2y目标文件生成1个 .so 动态库文件
- 2.用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录大小并与静态库比较
第 1 步:编辑生成例子程序 hello.h、hello.c 和 main.c。
先创建一个作业目录,用来保存本次练习的文件。
然后用 vim、nano 或 gedit 等文本编辑器编辑生成所需要的 3 个文件。分别是hello.h hello.c. main.c 。
hello.c 是函数库的源程序,其中包含公用函数 hello,该函数将在屏幕上输出"Hello XXX!"。hello.h(见程序 1)为该函数库的头文件。main.c为测试库文件的主程序, 在主程序中调用了公用函数 hello。
程序 1: hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
程序 2: hello.c
#include <stdio.h>
void hello(const char *name)
{
printf(“Hello %s!n”, name);
}
程序 3: main.c
#include “hello.h”
int main()
{
hello(“everyone”);
return 0;
}
第 2 步:将 hello.c 编译成.o 文件。
无论静态库,还是动态库,都是由.o 文件创建的。因此,我们必须将源程序 hello.c 通过 gcc 先编译成.o 文件。
在系统提示符下输入gcc -c hello.c 命令得到 hello.o 文件。并 运行 ls 命令看看是否生成了 hello.o 文件。
我们看到已经生成了 hello.o 文件,本步操作完成。
第 3 步:由.o 文件创建静态库。
静态库文件名的命名规范是以 lib 为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为 myhello,则静态库文件名就是 libmyhello.a。
创建静态库用 ar 命令。在系统提示符下输入ar -crv libmyhello.a hello.o 将创建静态库文件libmyhello.a。 并用ls命令查看结果,发现已经生成了这个静态库文件libmyhello.a。
第 4 步:在程序中使用静态库。
静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包 含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明静态库名,gcc 将会从 静态库中将公用函数连接到目标文件中。
注意,gcc 会在静态库名前加上前缀 lib,然后追 加扩展名.a 得到的静态库文件名来查找静态库文件。
在程序 3:main.c 中,我们包含了静态库的头文件 hello.h,然后在主程序 main 中直接调用 公用函数 hello。下面先生成目标程序 hello,然后运行 hello 程序看看结果如何。
方法一: gcc -o hello main.c -L. –lmyhello
方法二:gcc main.c libmyhello.a -o hello
方法三:
先生成 main.o:
gcc -c main.c
再生成可执行文件:
gcc -o hello main.o libmyhello.a
我们删除静态库文件试试公用函数 hello 是否真的连接到目标文件 hello 中了。
我们发现程序仍然可以运行,说明静态库中的公用函数已经连接到目标文件中了。
第 5 步:由.o 文件创建动态库文件。
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。
例如:我们将创建的动态库名为 myhello,则动态库文件名就是 libmyh ello.so。
在系统提示符下输入gcc -shared -fPIC -o libmyhello.so hello.o (-o 不可少) 得到动态库文件 libmyhello.so。
第 6 步:在程序中使用动态库。
在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含 这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。
虽然连接时用的是当前目录的动态库,但是运行时,是到 /usr/lib 中找库文件的,所以我们需要先将文件 libmyhello.so 复制到目录/usr/lib 中。
但是我们发现使用静态库和使用动态库编译成目标程序使用的 gcc 命令完全一样, 那当静态库和动态库同名时,gcc 命令会使用哪个库文件呢?
我们先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态。 再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so。
通过上述最后一条 ls 命令,可以发现静态库文件 libmyhello.a 和动态库文件 libmyhello.so 都已经生成,并都在当前目录中。然后,我们运行 gcc 命令来使用函数库 myhello 生成目 标文件 hello,并运行程序 hello。
从程序 hello 运行的结果中很容易知道,当静态库和动态库同名时,gcc 命令将优先使用动 态库,默认去连/usr/lib 和/lib 等目录中的动态库。
额外任务一:
在第一次作业的程序代码基础进行改编,除了x2x函数之外,再扩展写一个x2y函数(功能自定),main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
1.用gedit编写x2x.c、x2y.c、main.c、main.h。
x2x.c
x2y.c
main.c
main.h
2.将x2x.c 和x2y.c和main.c 编译成.o文件
3.将x2x、x2y目标文件用ar工具生成一个.a静态库文件
4.用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,并记录大小
额外任务二:
将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
1.将x2x、x2y目标文件生成1个 .so 动态库文件
2.用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录大小并与静态库比较
比较大小:
最后
以上就是酷炫鸭子为你收集整理的“用gcc生成静态库和动态库”及“静态库.a与.so库文件的生成与使用”的全部内容,希望文章能够帮你解决“用gcc生成静态库和动态库”及“静态库.a与.so库文件的生成与使用”所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复