概述
这里写自定义目录标题
- 1.可执行程序是如何被组装的
- 1.1(2)用gcc生成静态库和动态库
- 1.1(2)静态库.a与.so库文件的生成与使用
- 1.2用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
- 1.3将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
- 2.每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。
- 2.1(1)GCC编译器背后的故事
- 2.1(2)Linux GCC常用命令
- 2.2在ubuntu中下载安装nasm,对示例代码“hello.asm”编译生成可执行程序,并与“hello world”C代码的编译生成的程序大小进行对比。
- 3. 每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。
- 3.1了解Linux 系统中终端程序最常用的光标库(curses)的主要函数功能,写出几个基本函数名称及功能。
- 3.2以游客身份体验一下即将绝迹的远古时代的 BBS
- 3.3在Ubuntu中用 sudo apt-get install libncurses5-dev 安装curses库,请说明 头文件(比如curses.h)和库文件都被安装到哪些目录中。
- 4.Linux 环境下C语言编译实现贪吃蛇游戏
1.可执行程序是如何被组装的
1.1(2)用gcc生成静态库和动态库
第 1 步:编辑生成例子程序 hello.h、hello.c 和 main.c。
创建一个作业目录:
//程序 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 文件
第 3 步:由.o 文件创建静态库
第 4 步:在程序中使用静态库
第 5 步:由.o 文件创建动态库文件
第 6 步:在程序中使用动态库
如果是用的ubuntu16.04,则需要用gcc -fPIC -c hello.c命令生成hello.o再执行gcc -shared-fPIC-olibmyhello.sohello.o
1.1(2)静态库.a与.so库文件的生成与使用
静态库.a 文件的生成与使用
代码:
//A1.c:
#include <stdio.h>
void print1(int arg)
{
printf("A1 print arg:%dn",arg);
}
//A2.c:
#include <stdio.h>
void print2(char *arg)
{
printf("A2 printf arg:%sn", arg);
}
//A.h
#ifndef A_H
#define A_H
void print1(int);
void print2(char *);
#endif
//test.c:
#include <stdlib.h>
#include "A.h"
int main()
{
print1(1);
print2("test");
exit(0);
}
共享库.so 文件的生成与使用
1.2用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
$ vim sub1.c//编辑sub1.c文件
$ vim sub2.c//编辑sub2.c文件
$ vim main1.c//编辑main1.c文件
$ gcc sub1.c//编译sub1.c文件文件
$ gcc sub2.c//编译sub2.c文件文件
$ gcc main1.c//编译main1.c,sub1.c和sub2.c文件文件
$ ar -crv libmain1.a sub1.o sub2.o //生成静态文件库
$ gcc main1.c libmain1.a -o result //mian1.c与静态文件库连接
$ ./result//执行当前目录下的result的文件,‘./’是当前目录的意思
*代码:
//sub1.c
#include<stdio.h>
float x2x(float a,float b)
{
return a+b;//返回a+b的值
}
//sub2.c
#include<stdio.h>
float x2y(float a,float b)
{
return a*b;//返回a+b的值
}
//main1.c
#include"sub1.c"//引用sub1.c文件
#include"sub2.c"//引用sub2.c文件
#include<stdio.h>
float main()
{
float a=2,b=3;//定义
printf("%f",x2x(a,b));//输出x2x(a,b)的值
printf("%f",x2y(a,b));//输出x2y(a,b)的值
return 0;
}
1.3将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
$ gcc -shared -fPIC -o libmain1.so sub1.o sub2.o //生成动态文件库
$ gcc main1.c libmain1.so -o result //与动态文件库连接
对比可得,动态库文件比静态库文件更大。
2.每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。
2.1(1)GCC编译器背后的故事
2.1(2)Linux GCC常用命令
2.2在ubuntu中下载安装nasm,对示例代码“hello.asm”编译生成可执行程序,并与“hello world”C代码的编译生成的程序大小进行对比。
用$ sudo apt-get install nasm安装nasm:
用$ nasm -version查看是否安装成功:
编译生成可执行程序:
nasm生成的程序大小:
c语言生成的程序大小:
对比可知nasm编译得到的文件大小要比用gcc编译得到的文件大小要小很多。
代码:
; 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 ; 调用内核功能
3. 每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。
3.1了解Linux 系统中终端程序最常用的光标库(curses)的主要函数功能,写出几个基本函数名称及功能。
cbreak():调用cbreak函数后,除了"Del"和"Ctrl"键外,接受其他所有字符输入。
noecho()/echo():关闭/打开输入回显功能。
nl ()/nonl():输出时,换行是否作为回车字符。nl函数将换行作为回车符,而nonl函数相反。
3.2以游客身份体验一下即将绝迹的远古时代的 BBS
打开cmd命令窗口输入 telnet bbs.newsmth.net进入bbs
3.3在Ubuntu中用 sudo apt-get install libncurses5-dev 安装curses库,请说明 头文件(比如curses.h)和库文件都被安装到哪些目录中。
curses函数库的头文件安装在/usr/include/下,curses函数库的库文件安装在/usr/lib/下
4.Linux 环境下C语言编译实现贪吃蛇游戏
复制代码到ubuntu下,并保存为mysnake1.0.c
链接:http://www.linuxidc.com/Linux/2011-08/41375.htm
打开终端输入
如下图:
最后
以上就是笨笨小霸王为你收集整理的编译器背后的故事1.可执行程序是如何被组装的2.每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。3. 每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。4.Linux 环境下C语言编译实现贪吃蛇游戏的全部内容,希望文章能够帮你解决编译器背后的故事1.可执行程序是如何被组装的2.每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。3. 每一个程序背后都站着一堆优秀的代码库。了解实际程序是如何借助第三方库函数完成代码设计。4.Linux 环境下C语言编译实现贪吃蛇游戏所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复