编译器的背后可不止一个故事

本文详细介绍了在Linux环境中如何生成和使用静态库与动态库,包括创建过程、链接方式及文件大小对比等内容。此外还介绍了如何利用nasm编译汇编语言程序,并将其与C语言编写的程序大小进行了比较。

一、静态库.a与.so库文件的生成与使用

静态库的生成

1.创建一个文件 ,并该文件夹中创建三个子程序 hello.h、hello.c 和 main.c在这里插入图片描述
用gcc 将hello.c编译成hello.o文件在这里插入图片描述
由hello.o创建静态库在这里插入图片描述

静态库的使用

在这里插入图片描述

动态库的生成在这里插入图片描述

动态库的使用

在这里插入图片描述
由图可见,若直接./hello会出现报错,先将文件 libmyhello.so 移动到目录/usr/lib 中就可以解决

二、文件大小的对比

1.编译器背后

新建文件t2,并依次建立子程序s1.h

#ifndef SUB1_H
#define SUB1_H 
float x2x(int a, int b);
#endif //SUB1_H

s1.c

#include"sub1.h"

float x2x(int a, int b){
	return a + b;	//相加
}

s2.h

#ifndef SUB2_H
#define SUB2_H 
float x2y(int a, int b);
#endif //SUB2_H

s2.c

#include"sub2.h"

float x2y(int a, int b){
        return a * b;	//相乘
}

main.c

#include<stdio.h>
#include"sub1.h"
#include"sub2.h"

int main(){
	int a = 2, b = 3;
	printf("%d + %d = %f\n", a, b, x2x(a, b));
	printf("%d × %d = %f\n", a, b, x2y(a, b));
	return 0;
}

在这里插入图片描述

用静态库文件进行链接,生成可执行文件在这里插入图片描述
.o文件创建静态库
在这里插入图片描述

程序中使用静态库
在这里插入图片描述
用动态库文件进行链接,生成可执行文件在这里插入图片描述

两个可执行文件大小的比较在这里插入图片描述

gcc的编译过程

创建一个新文件t3,和子程序hello.c

#include <stdio.h>
int main(void)
{
	printf("Hello World! \n");
	return 0;
}

1.预编译

在这里插入图片描述

2.编译

在这里插入图片描述

3.汇编

请添加图片描述

4.链接

在这里插入图片描述

2.在ubuntu中下载安装nasm,对示例汇编代码“hello.asm”编译生成可执行程序,并与上述用C代码的编译生成的可执行程序大小进行对比

输入 sudo apt install nasm
在这里插入图片描述
新建文件t4,编译汇编语言hello.asm

; hello.asm 
section .data            ; 数据段声明
        msg db "Hello, world!", 0xA     ; 要输出的字符串
        len equ $ - msg                 ; 字串长度
section .text            ; 代码段声明
global _start            ; 指定入口函数
_start:                  ; 在屏幕上显示一个字符串
        mov edx, len     ; 参数三:字符串长度
        mov ecx, msg     ; 参数二:要显示的字符串
        mov ebx, 1       ; 参数一:文件描述符(stdout) 
        mov eax, 4       ; 系统调用号(sys_write) 
        int 0x80         ; 调用内核功能
                         ; 退出程序
        mov ebx, 0       ; 参数一:退出代码
        mov eax, 1       ; 系统调用号(sys_exit) 
        int 0x80         ; 调用内核功能

编译汇编在这里插入图片描述
汇编与C编译大小比较在这里插入图片描述

三、每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计

A.Linux 系统中终端程序最常用的光标库(curses)的主要函数功能

1、move(y,x);将光标移动至(x,y)处。
2、refresh();我们写入的内容首先会在系统缓冲区中,经过refresh()函数刷新之后才能够显示到屏幕上。
3、echo()和noecho();输入的字符显示和不显示在终端上。可以用密码输入。
4、输出:
addch();显示一个字符
addstr();显示一串字符串
printw(“格式”,变量);显示指定格式的内容,类似于printf();
mvaddstr();移动到某个位置输出。
5、输入:
getch();输入一个字符
getstr();输入一串字符串
scanw("%s",s);;按指定格式输入内容,类似于scanf();
mvaddstr();移动到某个位置输入。

B.在 win10 系统中,“控制面板”–>“程序”—>“启用或关闭Windows功能”

启用 “telnet client” 和"适用于Linux的Windows子系统"(后面会使用)。 然后打开一个cmd命令行窗口,命令行输入 telnet bbs.newsmth.net,以游客身份体验一下即将绝迹的远古时代的 BBS (一个用键盘光标控制的终端程序)。
在这里插入图片描述
打开一个 cmd命令行窗口,输入如下命令:

 telnet bbs.newsmth.net

以游客身份体验一下即将绝迹的远古时代的 BBS
在这里插入图片描述

C.在Ubuntu中用 sudo apt-get install libncurses5-dev 安装curses库;在这里插入图片描述

D.Linux 环境下C语言编译实现贪吃蛇游戏.点击这里获取代码

新建一个snake.c文件,填入代码在这里插入图片描述
编译并执行
在这里插入图片描述
运行效果
在这里插入图片描述
参考:
https://blog.youkuaiyun.com/xwmrqqq/article/details/109071198

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值