linux程序机制入门
GCC环境
- 类debian系统运行
apt-get install build-essential
安装gcc环境。 - 编写c语言程序后,运行
gcc ./hello.c
会得到一个名为 a.out 的文件,这就是编译后的可执行文件,执行./a.out
即可看到运行效果。
gcc的帮手
- gcc是一个套件,它依靠套件里的各个工具完成编译工作。
- cpp 工具,负责预处理源代码文件,比如把 引用的 .h文件的内容拷贝过来,将定义的宏替换下来,可运行命令
gcc -E hello.c > hello_cpp.c
就会得到预处理后的文件。 - 编译,运行
gcc -S hello.c
就会对 hello.c进行预处理和编译,从而得到 hello.s 文件,该文件里面是编译后的汇编代码。 - 运行
gcc -c hello.c
就会对文件进行预处理,编译,汇编,最终得到 hello.o 的机器码,此时该文件就是一个elf格式的二进制文件了,需要运行hexdump -C ./hello.o
来查看了。 - ld 工具:负责把编译好的一堆机器码和它们依赖的库文件的机器码链接起来,组成一个可运行的程序,命令
gcc main.o part1.o -o myapp
就会将编译好的.o文件链接成一个可执行的程序 myapp. - 运行
gcc hello.c -o hello.out
gcc会自动调用上面的4个工具,完成整个编译过程,最终得到一个可执行的hello.out 文件。
GBD 调试程序
- 类debian系统的安装命令:
apt-get install gdb
- 一般gcc编译出来的文件可以被gdb运行,但是由于没有和源代码关联,所以无法进行查看源文件,设置断点,查看变量等操作。使用
gcc -g hello.c
编译出来的则可以进行上述操作,因为-g参数将调试信息加入到目标文件了。 - gdb常用命令: run/r 命令,
gdb a.out
启动后并不会马上运行,需要输入run命令运行程序; break/b 命令,break 12
在第12行设置断点; list/l 命令,列出当前程序源代码;continue/c 命令,继续运行到下一个断点;print/p 命令,打印变量命令,如print i
打印变量 i 的值; examine/x 命令,查看指定内存地址中的数据;next/n 命令,单步执行命令,执行该命令的下一条指令; q 退出gdb环境。
make和Makefile
- make 是一个程序,类似windows的批处理命令,可以执行一批操作,格式如下:
目标:源
执行的操作
注意:执行的操作前面必须是一个tab键,不能是4个空格。
Makefile示例
- 假如我有三个文件 main.c, input.c, output.c ,要编译成 myapp,则可以写一个Makefile文件如下
all:mian.o input.o output.o
gcc main.o input.o output.o -o myapp
main.o:main.c
gcc -c main.c
input.o:input.c
gcc -c input.c
output.o:output.c
gcc -c output.c
clean:
rm ./*.o
rm myapp
install:myapp
cp ./myapp /usr/bin/
- 执行时,如果运行
make
,就会去找 all 这个目标,如果没有,就会执行第一行。
当然,也可以指定具体的目标,如make input.o
Autoconf和configuration
- debian下安装命令
apt-get install autoconf
,会安装相应的组件。 - Linux发行版五花八门,你发布的二进制软件不一定能在别的发行版正常安装和运行,所以在linux中一般以源码形式发布软件,同时源码中会附上针对特定发行版的 configuration 文件,这个文件就是用来在安装和运行该软件前检查系统环境的,比如是否有gcc编译器,版本是否符合,是否有运行该软件所依赖的库等等。
ldd ./myapp
会检查 myapp依赖的库。- 源码安装一般过程:1) 解压 app.tar.gz 或者 app.tat.bz2 2) 运行 ./configuration 和 make 命令
Autoconf组成
Autoconf 就是用来生成 configuration 文件的,它其实是又4个工具组成的。
Autoscan ,运行
autoscan
会检查源码结构,生成configure.scan 和 autoscan.log,该文件需要我们再修改,并重命名为 configure.ac ,该文件主要描述源码结构及各个文件之间的关系,示例如下:
# 项目主文件
AC_INIT(main.c)
#项目名称及版本号
AM_INIT_AUTOMAKE(myapp,1.0)
# 是否检查C编译器是否正常
AC_PROG_CC
#运行configure最终要生成的文件
AC_OUTPUT(Makefile)
Aclocal 对上面生成的configure.ac 做进一步细化,生成的文件为 aclocal.m4 ,该文件不需要修改。
Autoconf 根据 configure.ac 和 aclocal.m4 生成 configure 脚本。
自己先手动编写 Makefile.am , 它是Makefile.in 的模板,Makefile.am文件内容示例如下:
#是否检查源码目录下又GNU软件的标准文件,比如AUTHOR,NEWS, ChangeLog等文件。
AUTOMAKE_OPTIONS=foreign
#编译后的软件名为 myapp
bin_PROGRAMS=myapp
# 该项目包含哪些源文件
myapp_SOURCES=main.c input.c output.c
然后先运行 automake --add-missing
安装缺失的文件,最后运行 automake 就会生成 Makefile.in 了。
- 最后把这些文件打包就可以了,其它用户下载后,运行 configure后就会根据Makefile.in 生成 Makefile, 然后用户就可以运行 make 命令编译和安装软件了。
linux程序机制入门的更多相关文章
- 零基础程序员入门Linux系统 !如何快速恢复系统?
新手在学习Linux系统的时候,难免会遇到命令输错,或系统出错的难题.那么如何快速解决呢?本文就先给你一个后悔药,让你快速备份并恢复Linux系统.本文将以Ubuntu为例,在这之前,你需要一台服务器 ...
- Linux运维入门到高级全套常用要点
Linux运维入门到高级全套常用要点 目 录 1. Linux 入门篇................................................................. ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- Linux 运维入门到跑路书单推荐
一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...
- Linux模块机制浅析
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...
- Linux基础知识入门
[Linux基础]Linux基础知识入门及常见命令. 前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1: ...
- 利用linux信号机制调试段错误(Segment fault)
在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...
- Linux 内存机制详解宝典
Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...
- java反射机制入门01
java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...
随机推荐
- 更新edmx文件 无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull
使用EF DBFirst 更新模型的时候,提示的错误,这是VS的EF 引用MYSQL产生的错误,如下图: 解决方案: 1.win+R 打开运行窗口,输入services.msc 回车,然后找到MySQ ...
- JavaScript window.location物
演示样例 注意 方法 常常使用window.location.它的结构总是记不住.简单梳理下.方便以后查询. 演示样例 URL:http://b.a.com:88/index.php? name=ka ...
- Visual Studio for Mac第四预
微软发布Visual Studio for Mac第四预览版 去年 11 月,微软发布了 Visual Studio for Mac 的首个预览版本,并且承诺后续数月会带来更多功能.而今天,随着 Vi ...
- WPF 元素相对另外一个元素的 相对位置
原文:WPF 元素相对另外一个元素的 相对位置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/koloumi/article/details/740 ...
- Qt5官方demo解析集35——Music Player(使用winextras模块)
本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集34——Concentr ...
- Blend_技巧篇_导入PSD文件制作ToggleButton (Z)
原文:Blend_技巧篇_导入PSD文件制作ToggleButton (Z) 系统: Win7sp1 32位 IDE: Microsoft VisualStudio 2013 Ultimate Ble ...
- matlab 警告(warning)、错误(error)、异常(exception)与断言(assert)
0. 消息标识符(Message Identifiers) 消息标识符,是附加在 error 和 warning 语句上的一个标签,以被 matlab 做唯一性标识. warning 语句所支持的函数 ...
- WPF动画旋转(3轴同时旋转问题)
原文:WPF动画旋转(3轴同时旋转问题) WPF的资料比较少,做起来不是很方便,之前一直有个XYZ3个轴同时旋转的问题,开始的时候以为通过 this.theRotateX.Axis = new Ve ...
- [WebGL入门]十一,着色器编译器和连接器
注意:文章翻译http://wgld.org/,原作者杉本雅広(doxas).文章中假设有我的额外说明.我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语,假设翻译有误.欢迎大家 ...
- 中英文对照 —— 互联网、IT(信息科技)、编程
1. 网站 web-portal:门户网站: 2. 工具与方法 crowdsourcing:众包, crowd ⇒ 众: 3. 软件 MVP:最小化可行产品,Minimum Viable Produc ...