编译器背后的东西th5

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身后的编译

一.练习
  • 编写一个简单文本
    在这里插入图片描述
    hello.c

  • 使用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库,生成一个终端游戏

在这里插入图片描述

总结

        linux环境下编译感觉还不错。

参考: ld: i386 架构于输入文件 foo.o 与 i386:x86-64 输出不兼容
参考:linux动态库的路径查找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值