【嵌入式系统基础第二周作业】---GCC背后的故事

一.题目

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值