一、准备
- 1.环境配置
- 2.相关软件
- 二、执行程序的组装
- 1.gcc生成动态库和静态库.a与.so库文件的生成与使用
- 1).由.o文件创建静态库
- 2).由.o文件创建动态库
- 三、GCC编译工具的用途
- 1.预处理
- 2.编译为汇编代码
- 3.汇编
- 4.链接
- 四、Linux第三方库函数(最常用的光标库)的主要功能介绍。
- curses库的核心数据结构
- curses屏幕处理
- refresh函数
- 基本屏幕字符输出处理函数
- 1.从屏幕读取基本函数
- 2.BBS的体验之旅
- 1).BBS的配置
- 2).这有几个Linux上的游戏挺好玩的
- 五、引用资料
一、准备
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将做清除屏幕的工作
基本屏幕字符输出处理函数
i
nt 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函数库