Linux环境下可执行程序的安装和GCC以及ELF的初步使用,熟悉第三方函数库及游戏程序介绍
- 一、可执行程序的安装过程
- 1.使用用gcc生成.a静态库与.so动态库文件
- 2.静态库文件的使用
- 3.动态库文件使用
- 二、gcc编译工具集中各软件的用途,了解EFF文件格式,汇编语言格式
- 1. Linux GCC常用命令
- 2.比较hello.asm与C代码生成的文件大小
- 三、了解实际程序是如何借助第三方库函数完成代码设计
- 1.Linux 系统中终端程序最常用的光标库(curses)的主要函数功能
- 2.体验一下即将绝迹的远古时代的 BBS
- 3.安装curses库说明头文件和库文件被安装到哪些目录中
- 4.用gcc编译生成一个终端游戏,体会curses库如何被链接和使用
一、可执行程序的安装过程
可执行程序运行有:预处理、汇编、链接,汇编生成可执行程序。
1.使用用gcc生成.a静态库与.so动态库文件
- 创建main3.c,prctice.c,prctice.h文件
touch main3.c
touch practice.h
touch practice.c
- 用nano编辑3个文件
main3.c文件
#include "Practice.h"
void main()
{
hello("wudi");
}
practice.c文件
#include <stdio.h>
void hello(const char *name)
{
printf("MyNameIs \n", name);
}
practice.h文件
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
- 将practice.c编译成.o文件
gcc -c practice.c
- 创建.a静态库
ar -crv libmpractice.a practice.o
- 使用静态库,生成程序practice
gcc Main.c libmyPractice.a -o Practice
- 创建.so动态库文件
gcc -shared -fPIC -o libmyPractice.so Practice.o
- 使用动态库
gcc -shared -fPIC -o libmyPractice.so Practice.o
2.静态库文件的使用
- 接上次实验的例子嵌入式系统程序设计基础第1,2周
再创建一个test2.c文件并修改mian1.c文件
mian1.c文件
#include<stdio.h>
#include"sub1.c"
#include"test2.c"
void main()
{
int a=8,b=6;
float c;
float d;
c=x2x(a,b);
d=x2y(a,b);
printf("%f\n",c);
printf("%f\n",d);
}
test.c文件
#include<stdio.h>
float x2y (int a,int b)
{
float d;
d=a+b;
return d;
}
- 使用gcc命令编译文件
- 将sub1.o和test2.o用 ar工具生成1个 .a 静态库文件
ar -crv libmy2xy.a sub1.o test2.o
- 使用gcc进行链接
gcc main1.c libmy2xy.a -o mainxy
- 运行main1程序
./mainxy
- ls查看文件大小
ls -l mainxy
3.动态库文件使用
- 用ar工具生成1个 .so 动态库文件
ar -crv libmy2xy.so sub1.o test2.o
- 用gcc进行链接
gcc main1.c libmy2xy.so -o mainso
- 运行main1程序
./mainso
- ls查看文件大小
ls -l mainxy
二、gcc编译工具集中各软件的用途,了解EFF文件格式,汇编语言格式
1. Linux GCC常用命令
- 创建一个main.c文件
#include <stdio.h>
int main()
{
printf("My name is wudi\n");
return 0;
}
-
用gcc一步编译
-
分步编译
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o -o main
2.比较hello.asm与C代码生成的文件大小
-
安装nasm
-
新建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 ; 调用内核功能
-
生成,运行hello文件并记录大小
-
新建hello.c文件,运行并记录大小
#include<stdio.h>
int main()
{
printf("hello, world!\n");
return 0;
}
- 比较“hello.asm”编译生成可执行程序与“hello world”C代码的编译生成的程序大小可以看出,hello.asm编译生成的可执行程序比hello.c的编译生成的程序要小得多。
三、了解实际程序是如何借助第三方库函数完成代码设计
1.Linux 系统中终端程序最常用的光标库(curses)的主要函数功能
麻烦请参考Linux下curses函数库的学习
2.体验一下即将绝迹的远古时代的 BBS
在 win10 系统中,“控制面板”–>“程序”—>“启用或关闭Windows功能”,启用 “telnet client” 。 然后打开一个cmd命令行窗口,命令行输入 telnet bbs.newsmth.net,以游客身份体验一下即将绝迹的远古时代的 BBS。
3.安装curses库说明头文件和库文件被安装到哪些目录中
4.用gcc编译生成一个终端游戏,体会curses库如何被链接和使用
麻烦请参考Linux下使用Curses库+时钟信号编写视频小游戏:对战贪吃蛇
curses库实现的弹球游戏
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)