目录
2.用vim编写hello.h、hello.c和main.c文件
1.用vim编写x2x.c、x2y.c、main.c、main.h。
3.将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件
4.用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,并记录大小
6.用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录大小并与静态库比较
一、gcc 生成 .a 静态库和 .so 动态库
1.创建作业目录
(1)创建test1目录
(2)进入test1目录
2.用vim编写hello.h、hello.c和main.c文件
程序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;
}
3.将 hello.c 编译成.o 文件
用ls命令查看是否生成
4.由.o文件创建静态库
用ls命令查看是否生成
5.程序中使用静态库
下面先生成目标程序 hello,然后运行 hello 程序看看结果如何。
运行hello文件
删除静态库文件试试公用函数 hello 是否真的连接到目标文件 hello 中了
程序照常运行,静态库中的公用函数已经连接到目标文件中了
6.由.o 文件创建动态库文件
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其文件扩展名为.so
7.在程序中使用动态库
在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含 这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。我 们先运行 gcc 命令生成目标文件,再运行它看看结果。
(或 #gcc main.c libmyhello.so -o hello 不会出错(没有 libmyhello.so 的话,会出错),但是 接下来./hello 会提示出错,因为虽然连接时用的是当前目录的动态库,但是运行时,是到 /usr/lib 中找库文件的,将文件 libmyhello.so 复制到目录/usr/lib 中就 OK 了)
将文件 libmyhello.so 复制到目录/usr/lib 中,再运行
8.当静态库和动态库同名时,gcc 命令会使用哪个库文件
先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态
再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so。
二、作业一程序基础gcc改编生成静态库和动态库并比较大小
1.用vim编写x2x.c、x2y.c、main.c、main.h。
main.h
#ifndef MAIN
#define MAIN
#include<stdio.h>
float x2x(int x,int y);
float x2y(int x,int y);
#endif
main.c
#include"main.h"
int main()
{