编译器背后的故事
一、静态库与动态库文件的生成和使用
1、利用gcc生成静态库和动态库
1、编辑生成例子程序
(1)先创建一个作业目录,保存本次练习的文件
然后用 vim编辑生成所需要的 3 个文件
程序 1: hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
程序 2: hello.c
#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n", name);
}
程序 3: main.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
(2)接着将 hello.c 编译成.o 文件
在 ls 命令结果中,我们看到了 hello.o 文件,本步操作完成。
(3)由.o 文件创建静态库
(4)在程序中使用静态库
(5)由.o 文件创建动态库文件。
这一步出现错误,导致无法建立动态库文件。(后来找到找到解决方法)
(6)在程序中使用动态库
出现问题,无法是找不到动态库文件 libmyhello.so。将文件 libmyhello.so 复制到目录/usr/lib 中,结果提示权限不足。
利用sudo命令以管理员权限执行命令,成功运行。
2、在第一次作业的程序代码基础进行改编,扩展写一个x2y函数
(1)建立sub2.c
(2)编写代码
(3)修改main1.c
(4)用gcc生成3个.o 目标文件
(5)创建静态库文件
(6)用 gcc将main函数的目标文件与此静态库文件进行链接
(7)运行程序
(8)在文件夹中查看main1的大小
(9)建立动态库文件
(10)连接动态库
(11)运行maina
(12)在文件夹中查看maina的大小
经比较,发现maina文件的大小比main1的少了40字节,于是得出结论:静态库最后生成的执行文件要比动态库的要大
二、gcc编译工的常用命令操作及as汇编编译器的操作
1、Linux GCC常用命令
(1)新建hello.c
(2)编写程序
(3)编译
(4)预处理
(5)编译为汇编语言
(6)汇编
(7)链接
(10)运行程序
2、as汇编编辑器
(1)在ubutu中安装nasm
(2)创建asm文件
(3)编程
(5)编译
(6)生成可执行文件并运行
(7)比较可执行文件的大小
经比较,发现asm汇编生成的文件比.c文件生成的可执行文件小
三、利用第三方库函数来完成设计
1、常用的光标库(curses)的主要函数功能
函数 | 函数功能 |
---|---|
initscr() | 打开curses模式 进入终端 |
endwin() | 关闭窗口stdscr |
cbreak() | 接受单个字符处理 禁止行缓冲 |
echo() | 显示字符 |
noecho() | 关闭回显 让键盘输入字符 不显示在终端上 |
keypad(WINDOW *, bool) | 指定窗口 激活功能键 上下左右 F1 F2等 |
start_color() | 打开color模式 |
scroll() | 指定窗口 接受字符 超过一行自动写入下一行 |
move(y,x) | 将游标移至x,y位置 |
addch(ch) | 在当前位置画字符ch |
2、体验一远古时代的BBS
(1)打开控制面板,点击“程序”,点击“启用或关闭Windows功能”
(2)点击’telnet client’和‘适用于Linux的Windows子系统’
(3)打开cmd并输入telnet bbs.newsmth.net
访问界面如下:
3、安装curses库
(1)输入sudo apt-get install libncurses5-dev安装curses库
其中头文件和库文件分别安装在/usr/include/和/usr/lib/中。
4、Linux 环境下C语言编译实现贪吃蛇游戏
(1)建立一个snake.c文件
(2)编程
由于代码过长,只展示部分代码,完整代码参考下面网站
(3)编译
(4)运行程序
其中为贪吃蛇,@为目标