文章目录
- 一.题目
- 1)阅读、理解和学习材料“用gcc生成静态库和动态库.pdf”和“静态库.a与.so库文件的生成与使用.pdf”,请在Linux系统(Ubuntu)下如实仿做一遍。
- 2 ) 在第一次作业的程序代码基础进行改编,除了x2x函数之外,再扩展写一个x2y函数(功能自定),main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。;
- 3)将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
- 4)Gcc不是一个人在战斗。请说明gcc编译工具集中各软件的用途,了解EFF文件格式。学习任务如下:阅读、理解和学习材料“Linux GCC常用命令.pdf”和“GCC编译器背后的故事.pdf”,如实仿做一遍.
- 二.详细解答
一.题目
1)阅读、理解和学习材料“用gcc生成静态库和动态库.pdf”和“静态库.a与.so库文件的生成与使用.pdf”,请在Linux系统(Ubuntu)下如实仿做一遍。
2 ) 在第一次作业的程序代码基础进行改编,除了x2x函数之外,再扩展写一个x2y函数(功能自定),main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。;
3)将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
4)Gcc不是一个人在战斗。请说明gcc编译工具集中各软件的用途,了解EFF文件格式。学习任务如下:阅读、理解和学习材料“Linux GCC常用命令.pdf”和“GCC编译器背后的故事.pdf”,如实仿做一遍.
二.详细解答
第(1)小问的详解
1个人理解
先谈谈个人阅读理解学习材料的感悟,首先是一个程序文件的执行处理过程分为预处理->编译 ->汇编 -> 连接这四步,其中连接这步则是将处理好的文件构建连接,进而得到可执行文件,所以在这步就产生出了静态库和动态库的操作,其中的目的就是便于对各种文件进行自主连接从而得到相要的执行效果。其中静态库就是先将文件连接再运行,动态库则是在文件运行时进行连接
2仿做展示
2.1 测试所建立以及产生的文件
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif//HELLO_H
hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("Hello %s\n",name);
}
main.c
#include"hello.h"
int main()
{
hello("everyone");
return 0;
}
2.2静态库测试
步骤:gcc编译得到.o文件->用ar创建静态库->连接静态库
连接静态库的第一种方法
连接静态库的第二种方法
连接静态库的第三种方法
2.3动态库测试
步骤:gcc编译得到.o文件->用gcc创建动态库->将产生的动态库文件复制到特定目录->连接动态库
完整测试图示
将产生的动态库文件复制到特定目录代码(需要在管理员权限下执行):
cp libnihao.so /usr/lib
cp是复制,也可改为mv为移动
2.4静/动态库的简单比较
测试文件大小
静态库
动态库
补充:而且在动静态库同时执行时,优先执行动态库
2.5实例测试
先构建基本文件
A1.c
#include<stdio.h>
void print1(int arg)
{
printf("A1 print arg:%d\n",arg);
}
A2.c
#include<stdio.h>
void print2(char *arg)
{
printf("A2 printf arg:%s\n",arg);
}
A.h
#ifndef A_H
#define A_H
void print1(int);
void print2(char *);
#endif
test.c
#include<stdio.h>
#include"A.h"
int main()
{
print1(1);
print2("test");
exit(0);
}
步骤一:gcc编译得到.o文件->用ar创建静态库->连接静态库
测试无误
步骤二:gcc编译得到.o文件->用gcc创建动态库->将产生的动态库文件复制到特定目录->连接动态库
测试无误
第(2)小问的详解
建立基础文件
sub1.c
float x2x(int a,int b)
{
float c=0;
c=a/b;
return c;
}
sub2.c
float x2y(int a,int b)
{
float c=0;
c=a*b;
return c;
}
sub.h
#ifndef SUB_H
#define SUB_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif
main.c
#include<stdio.h>
#include"sub.h"
void main()
{
int a,b;
printf("Please input the value of a:");
scanf("%d",&a);
printf("Please input the value of b:");
scanf("%d",&b);
printf("a*b=%.2f\n",x2y(a,b));
printf("a/b=%.2f\n",x2x(a,b));
}
步骤:gcc编译得到.o文件->用ar创建静态库->连接静态库进行测试
测试无误
文件大小
第(3)小问的详解
结合第二问构建的基础文件
步骤:gcc编译得到.o文件->用gcc创建动态库->将产生的动态库文件复制到特定目录->连接动态库
测试无误
文件大小
经对比,动态库的文件大于静态库
第(4)小问的详解
按照材料进行的测试,比较冗杂,所以只展示图片,没文字解析
参考链接:https://blog.csdn.net/qq_43279579/article/details/109026927