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程序机制入门的更多相关文章

  1. 零基础程序员入门Linux系统 !如何快速恢复系统?

    新手在学习Linux系统的时候,难免会遇到命令输错,或系统出错的难题.那么如何快速解决呢?本文就先给你一个后悔药,让你快速备份并恢复Linux系统.本文将以Ubuntu为例,在这之前,你需要一台服务器 ...

  2. Linux运维入门到高级全套常用要点

    Linux运维入门到高级全套常用要点 目 录 1. Linux 入门篇................................................................. ...

  3. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  4. Linux 运维入门到跑路书单推荐

    一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...

  5. Linux模块机制浅析

    Linux模块机制浅析   Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...

  6. Linux基础知识入门

    [Linux基础]Linux基础知识入门及常见命令.   前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1: ...

  7. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

  8. Linux 内存机制详解宝典

    Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...

  9. java反射机制入门01

    java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...

随机推荐

  1. 打造开发React Native的Sublime

     之前一年多一直用Sublime Text做前端开发,最近做React开发,发现不太好用,就尝试其他编辑器.WebStorm和VS Code都用过,WebStorm基本不用装插件,可以直接用,但用习惯 ...

  2. new与属性访问的顺序,从一道JS面试题说起

    这段时间一直在研究设计模式,在看工厂模式的时候,看到一段代码 VehicleFactory.prototype.createVehicle = function ( options ) { if( o ...

  3. Arcgis api for javascript学习笔记 - 不改变默认端口(6080)情况下,外网访问Arcgis Server 发布的接口

    Arcgis Server发布的地图服务地址默认端口号是6080,假设本机上只对80端口做了外网映射,在IIS中部署了一个网站绑定了80端口,那么网站中某个页面通过arcgis api for js ...

  4. Android官方教程翻译(5)——设置ActionBar

    Setting Up the Action Bar 设置Action Bar PREVIOUSNEXT THIS LESSONTEACHES YOU TO 这节课教你 1.    Support An ...

  5. Information Centric Networking Based Service Centric Networking

    A method implemented by a network device residing in a service domain, wherein the network device co ...

  6. QT开发环境的建立以及QTE4.6.3、tslib1.4的移植过程

    1.首先是建立Linux开发环境1.1.在windowsXP下安装博创公司提供的虚拟机软件VMware Workstation,版本为VMware-workstation-full-7.0.1-227 ...

  7. uwp - 控件精确移动动画

    原文:uwp - 控件精确移动动画 先看效果图: 一共有8个GRID,黄色的负责移动,其他7个负责定位.新建一个页面page,替换默认代码: <UserControl.Resources> ...

  8. 跟我学ASP.NET MVC之十:SportsStrore安全

    摘要: 在之前的文章中,我给SportsStore应用程序添加了产品管理功能,这样一旦我发布了网站,任何人都可能修改产品信息,而这是你必须考虑的.他们只需要知道你的网站有这个功能,以及功能的访问路径是 ...

  9. 【多线程】python界面阻塞,白屏,not responding解决的简单例子

    x = 0 QWidget. self.thread = Worker() self.xLable = QLabel( self.spinBox = QSpinBox() self.spinBox.s ...

  10. SEO分享:为什么我的资源外链这么多的高品质?

    在小浪前制成的制品" [完整版]我怎么3的月800单词索引厨师主页!".之后,很多人都表示了极大的钦佩观看.顽强的运行力,真SEO它是运行顽强的力量.也有人说是吹牛吧,一天500外 ...