Ubuntu 16.04 版Linux下的编译
GCC下动态库与静态库的生成和链接
一.练习
-
创建目录test1,文本文件hello.h hello.c main.c
文本代码:
-
编译
将hello.c编译成.o文件,ls命令查看是否成功生成了.o文件
把.o文件创建为静态库,ar命令实现
有三种方法使得程序可使用静态库
把.o文件创建文件动态库文件
程序使用动态库运行
二.实战
-
创建并编译文本文件main.o sub1.o sub2.o
-
先将sub目标文件与sub2目标文件用ar工具生成静态库文件
与静态库连接运行
-
将sub目标文件与sub2目标文件生成动态库文件,并连接运行
-
比较连接不同库生成后文件的大小,前者为静态库,后者为动态库
GCC身后的编译
一.练习
-
编写一个简单文本
-
使用gcc命令编译hello.c,先预处理,编译,再汇编,最后生成可执行文件hello
-
size命令可查看可执行文件大小,ldd命令可查看链接的动态库
-
静态可执行文件大小更大
-
ELF文件,用readelf命令查看
-
Objdump命令可反汇编
-
三种检错方法
二.nasm编译器操作
-
先下载nasm汇编编译器,命令sudo apt-get install nasm
-
编译代码,虽有警告不影响输出结果
-
编译的程序大小
可见nasm编译器生成的可执行文件大小很小。
第三方库函数
一.光标库
linux 系统中终端程序最常用的*光标库(curses)*最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的,主要有一下几个 函式:
-
initscr()
initscr() 是一般 curses 程式必须先呼叫的函数, 一但这个函数被呼叫之後, 系统将根据终端机的形态并启动 curses 模式. -
endwin()
curses 通常以呼叫 endwin() 来结束程式. endwin() 可用来关闭curses 模式, 或是暂时的跳离curses 模式.如果您在程式中须要call shell ( 如呼叫 system() 函式 ) 或是需要做 system call,就必须先以endwin()暂时跳离curses模式. 最後再wrefresh()doupdate() 来重返 curses 模式. -
cbreak()/nocbreak()
当 cbreak 模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak 模式时, 从键盘输入的字元将被储存在 buffer 里直到输入 RETURN或 NEWLINE. -
keypad(win,bf)
呼叫 keypad 时须传入两个值:win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscrbf 为 TRUE 或 FALSE当开启keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一些特殊键. 这些定义的特殊键通常以 KEY_ 开头。
二.BBS
- 打开控制面板”–>“程序”—>“启用或关闭Windows功能”,启用 “telnet client” 和"适用于Linux的Windows子系统"
重启电脑后,win+r进入终端,输入telnet bbs.newsmth.net,可以体验一下即将绝迹的远古时代的 BBS
三.安装curses库
- linux中安装curses库,sudo apt-get install libncurses5-dev
使用whereis命令查看curses的库文件和头文件安装在哪个目录下
可以看到头文件的目录。
四.gcc链接curses库,生成一个终端游戏
- 创建一个文本文件snake.c,参考Linux 环境下C语言编译实现贪吃蛇游戏
- 输入命令 gcc snake.c -lcurses -o snake 后运行 snake程序。(有不影响程序运行的警告)
总结
linux环境下编译感觉还不错。
参考: ld: i386 架构于输入文件 foo.o 与 i386:x86-64 输出不兼容
参考:linux动态库的路径查找