关于GCC和它的一些故事以及第三方库函数的简易介绍

一、准备

1.环境配置

虚拟机一台,系统我装的是ubuntu18.04
百度云链接
提取码:9wx2

2.相关软件

sudo apt-get update
sudo apt-get install gcc
sudo apt-get install libncurses5-dev(ubuntu18.04需要自己下载库函数)

二、执行程序的组装

1.gcc生成动态库和静态库.a与.so库文件的生成与使用

首先先编译三个小程序,分别命名为hello.c、hello.h、main.c。

1).由.o文件创建静态库

使用gcc main.c libmyhello.a -o hello 命令生成hello文件
在使用./hello执行。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以删除libmyhello.a文件再执行一遍刚刚的命令,验证公共函数hello是否连接到目标文件hello中了
在这里插入图片描述

2).由.o文件创建动态库

使用gcc -shared -fPIC -o libmyhello.so hello命令创建动态函数库
在这里插入图片描述

运行gcc main.c libmyhello.so -o hello
生成hello文件
运行./hello
在这里插入图片描述

三、GCC编译工具的用途

在刚才的文件夹中新建一个程序命名为test.c
在这里插入图片描述
一步到位gcc test.c -o test
其实这一步包含了四个步骤,分别是预处理、编译、汇编、链接

1.预处理

gcc -E test.c -o test.i或gcc -E test.c
-E 选项,可以让编译器在预处理后停止,并输出与处理结果。

在这里插入图片描述

2.编译为汇编代码

预处理之后,可以直接对生成的test.i文件编译,生成汇编代码
gcc -S test.i -o test.s
-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

在这里插入图片描述

3.汇编

gcc -c test.s -o test.o

4.链接

gccl连接器是gas提供的,负责将程序的目标文件与所需的所有附加目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态链接库。
gcc test.o -o test
上述步骤分别生成下面这些文件
在这里插入图片描述
size test 查看大小
在这里插入图片描述
ldd test 查看链接库
在这里插入图片描述
readelf -S test 查看反汇编EFLF文件
在这里插入图片描述
反汇编ELF
objdump -D test
在这里插入图片描述

objdump -S test
在这里插入图片描述

四、Linux第三方库函数(最常用的光标库)的主要功能介绍。

curses是一个在Linux/Unix下广泛应用的图形库函数,作用是可以在终端绘制简单的图形用户界面。
curses使用两个数据结构映射终端屏幕当前的终端屏幕,stdscr和curscr。stdscr是逻辑屏幕,curscr是物理屏幕也就是当前屏幕,在调用refresh函数时,函数库会将cursor刷新为stdscr得到样子。

curses库的核心数据结构

stdscr
对应于“标准屏幕”,是curses程序的默认输出窗口
工作原理与stdio函数库中的stdout非常相似
在curses函数产生输出时被刷新
在调用refresh函数之前,输出到stdscr上的内容不会在屏幕上显示
curscr
对应当前屏幕外观
调用refresh函数时,curses函数库比较stdscr及curscr之间的不同之处,然后用两个数据结构之间的差异来刷新屏幕
curses程序需了解stdscr,但不需要使用curscr数据结构

curses屏幕处理

函数定义
#include <curses.h>
WINDOW* initscr(void);
在一个程序中只能调用一次
判断终端类型和初始化Curses数据结构,同时也对终端进行一次刷新以清除屏幕,为以后的操作做准备
成功时,返回一个指向stdscr结构的指针
失败时,返回一个诊断信息并使程序结束

函数定义
int endwin(void);
将恢复tty终端原来的状态,把光标移到屏幕的左下角, 重置终端为非虚拟模式
调用成功时返回OK,失败时返回ERR
清屏处理方法
调用endwin函数退出curses
调用clearok(stdscr, 1)
调用refresh函数

refresh函数

函数定义
int refresh(void);
说明
curses最常用的一个函数
在调用屏幕输出函数试图改变屏幕上的画面时,curses并不会立刻对屏幕做改变,而是等到refresh()调用后,才将刚才所做的变动一次完成
其余信息维持不变,以尽可能送最少字符发送至屏幕上,减少屏幕重绘时间
如果是initscr()后第一次调用refresh(),curses将做清除屏幕的工作

基本屏幕字符输出处理函数

int addch(const chtype ch);
//在当前光标位置输入单个字符,并将光标右移一位,可附加加字符修饰参数类函数
int addchstr(chtype* const string_to_add);
//在当前光标位置输入一个字符串
int printw(char* format, …);
//采用与printf相同机制字符串格式化,并将其添加到光标的当前位置
int insch(chtype ch);
//把字符ch插入到光标左边,光标后面的所有字符向右移动一个位置在这一行最右端的字符可能会丢失
int insertln(void);
//插入一个空行,将现有行依次向下移一行
int delch(void);
//删除光标左边字符,并把光标右边余下的字符向左移动一个位置
int deleteln(void);
//删除光标下面的一行,并把下面所有的其他行都向上移动一个位置, 此外,屏幕最底下的一行将被清除
int box(WINDOW* win_ptr, chtype vertical_char, chtype horizontal_char);
//自动画方框
vertical_char :画方框时垂直方向所用字符
horizontal_char:画方框时水平方向所用字符
int beep(void);

1.从屏幕读取基本函数

chtype inch(void);
返回光标当前位置的字符及其属性
int instr(char* string);
将返回内容写到字符数组中
int innstr(char* string, int number_of_characters);
将返回内容写到字符数组中,可以指定返回字符的个数
//让程序发出声音
int flash(void);
//使屏幕闪烁
还有更多更加详细的内容请参考

2.BBS的体验之旅

1).BBS的配置

在这里插入图片描述

2).这有几个Linux上的游戏挺好玩的

Linux 环境下C语言编译实现贪吃蛇游戏
10个终端游戏

五、引用资料

Linux - curses函数库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值