linux下理解编译器的运行

一、可执行文件的组装

1. gcc生成静态库/动态库

进入linux终端,先建立一个作业目录test1,如下图

在这里插入图片描述
然后用vim写如下代码

//hello.c
#include <stdio.h>
void hello(const char *name)
{
	printf("Hello %s!\n",name);
}
//hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
//main.c
#include "hello.h"
int main()
{
	hello("everyone");
	return 0;
}

由.o文件生成静态库libmyhello.a,如下图
在这里插入图片描述
由.o文件创建动态库libmyhello.so,如下图
在这里插入图片描述
在这里插入图片描述

2. 静态库文件链接(实践)

已建好3个文件main.c,sub1.c,sub2.c,代码如下

//main.c
#include <stdio.h>
#include "sub1.c"
#include "sub2.c"

int main()
{
	int a = 3;
	int b = 5;
	float c;
	float d;
	c = x2x(a, b);
	d = x2y(a, b);
	printf("%f \n", c);
	printf("%f \n", d);
	return 0;
}
//sub1.c
#include <stdio.h>

float x2x(int a, int b)
{
	float c;
	c = a + b;
	return c;
}
//sub2.c
#include <stdio.h>

float x2y(int a, int b)
{
	float d;
	d = a - b;
	return d;
}

用gcc编译为.o文件
在这里插入图片描述
将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件libsub.a

在这里插入图片描述
main函数与此静态库文件进行链接,并运行main文件,正确
在这里插入图片描述
main文件大小如下
在这里插入图片描述

3. 动态库文件链接(实践)

创建动态库文件libsub.so
在这里插入图片描述
将main函数与此动态库文件进行链接,并运行main1文件,正确
在这里插入图片描述
main1文件大小如下,并与main文件比较,两者一样大
在这里插入图片描述

二、gcc编译工具

1. gcc常用命令

创建一个文件夹testgcc,写一个简单程序test,一步到位编译如下
在这里插入图片描述
实质上分为四个过程,如下

1.预处理(.i文件)

gcc -E test.c -o test.i

在这里插入图片描述
2. 编译为汇编代码(.s文件)

gcc -S test.i -o test.s

在这里插入图片描述
3. 汇编为目标文件(.o文件)

gcc -c test.s  -o test.o

在这里插入图片描述
4. 连接

gcc test.o -o test

在这里插入图片描述

2. nasm初步使用

在ubuntu18.04中安装nasm
在终端输入如下命令:
sudo apt-get install nasm

在testgcc文件夹下创建文件hello.asm代码如下

;hello.asm
section .dara	;
      msg db "Hwllo,world!",0xA	;
      len equ $ - msg	;
section .text	;
global _start	;
_start:		;
	mov edx, len	;
	mov ecx, msg	;
	mov ebx, 1	;
	mov eax, 4	;
	int 0x80	;
	;
	mov ebx, 0	;
	mov eax, 1	;
	int 0x80	;

在这里插入图片描述
对hello.asm编译生成可执行程序,并运行
在这里插入图片描述
hello与test文件大小比较,显然nasm编译的文件要小
在这里插入图片描述

三、程序借助第三方库设计代码

1. Linux 系统中光标库(curses)主要函数功能了解

初始化和重置函数:
所有curses程序必须以initscr函数开始,以endwin函数结束。
管理屏幕的函数:
在curses程序中输出字符的过程如下所示 
(1):使用curses函数刷新逻辑屏幕。
(2):要求curses用refresh函数来刷新物理屏幕。 管理窗口的函数 curses函数库支持在一个物理屏幕上显示多个窗口
详细请参考此网站

2. win10下体验BBS

在 win10 系统中,“控制面板”–>“程序”—>“启用或关闭Windows功能”,启用 “telnet client” 和"适用于Linux的Windows子系统"

然后需要重启电脑

下一步打开一个cmd命令行窗口,命令行输入 telnet bbs.newsmth.net

在这里插入图片描述
在这里插入图片描述

3. Ubuntu中安装curses库

安装
  ubuntu11.10下默认没有安装curses函数库,(CentOS下默认已经安装,可以直接在usr/include下查看是否有该头文件来确定)使用
  >sudo apt-get install ncurses-dev 
  安装curses库,这样在curses函数库的头文件和库文件就被分别安装在/usr/include//usr/lib/下,在编译程序时,直接使用命令:
  gcc program.c -o program -lcurses
  完成编译,运行。
 
curses函数库头文件安装位置:/usr/include/
curses函数库库文件安装位置:/usr/lib/

4. gcc编译生成一个终端游戏,体会curses库如何被链接和使用

参考网站戳这里
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值