• 机器语言,汇编语言与高级语言
  • C语言的编译和链接
  • 什么是Makefile?
  • autoconf&automake
  • 实例

机器语言,汇编语言与高级语言

机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。
早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂,不方便阅读和修改,也容易产生错误。

编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

1000100111011000 机器指令
mov ax,bx 汇编指令

将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。
由于汇编语言依赖于硬件体系,且助记符量大难记,于是人们又发明了更加易用的所谓高级语言。在这种语言下,其语法和结构更类似普通英文,且由于远离对硬件的直接操作,使得一般人经过学习之后都可以编程。

高级语言: 面向过程-C, 面向对象C++,Java.

所以, 高级语言要执行,最终是要经过编译转化为汇编语言才能被机器执行。

C语言的编译和链接

编译是把源码编译成中间代码文件,
在Windows下是.obj文件, 在Linix下是.o 的文件,即Object File, 目标文件

链接处理的是目标文件之间的调用关系。方式就是把目标文件打个包, 在Windows 下这个包文件爱你叫Library-库文件, 以.lib结尾。
在Linux下叫Archive文件, 以 .a结尾。

源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现。

没有Makefile的编译
gcc -o myapp main.c func1.c func2.c func3.c

以上编码包括代码:
主程序代码 main.c
三个子函数 : funcx.c

写在Makefile 文件中:
myapp: main.c func1.c func2.c func3.c
gcc -o calc main.c func1.c func2.c func3.c
这是一个基本的Makefile语句,它主要分成了三个部分,
第一部分:第一行冒号之前的myapp,我们称之为目标(target),被认为是这条语句所要处理的对象,具体到这里就是我们所要编译的这个程序myapp。
第二部分:冒号后面的部分(main.c func1.c func2.c func3.c),我们称之为依赖关系表,也就是编译所需要的文件
第三部分: 命令部分,就是一条编译命令

什么是Makefile?

Makefile是一个文件。

makefile定义整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

Makefile文件被 make命令使用。make是如何工作的呢?
在默认的方式下,
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
3. 如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4. 如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5. make会生成 .o 文件,然后再用 .o 文件声明make的终极任务,也就是执行文件edit了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦

autoconf&automake

Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。
Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。
当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。这样就造成了手工书写Makefile的诸多问题,automake恰好能很好地帮助我们解决这些问题。

使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile
autoconf用来生成configure configure生成makefile make就去调gcc编译源文件

使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile.

实例

  1. 在工作目录下新建testmake目录
mkdir testmake
cd testmake
  1. 编写源代码 helloworld.c
    vi helloworld.c
int main(int argc,char** argv)
{printf("Hello,My First Linux Make");return 0;
}
  1. 生成configure.
    使用autoscan命令,生成configure.scan的文件
    autoscan
    重命名为configure.in, 并修改文件内容
    mv configure.scan configure.in
                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.AC_INIT(helloworld.c)AM_INIT_AUTOMAKE(helloworld,1.0)# Checks for programs.
AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT(Makefile)
  1. 执行 aclocal 和autoconf, 产生aclocal.m4及configure
    aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。
     autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。
     autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。
      m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器.

5.创建Makefile.am
新建Makefile.am文件,命令:$ vi Makefile.am
automake会根据你写的Makefile.am来自动生成Makefile.in。Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=helloworldhelloworld_SOURCES=helloworld.c

6.运行automake –add-missing

automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。

  1. 执行configure生成Makefile
./configure

8.使用Makefile编译代码

make 

9.运行

./helloworld

Linux下autoconf与automake相关推荐

  1. Linux下autoconf和automake使用

    Linux下autoconf和automake使用 转自:http://hi.baidu.com/liuyanqiong/blog/item/0a6f0ad9d28e1d3d32fa1c7b.html ...

  2. Linux下Makefile的automake生成全攻略(转)

    Linux下Makefile的automake生成全攻略(转)[@more@] 文/余涛 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便 ...

  3. Linux下Makefile的automake生成全攻略--转

    http://www.yesky.com/120/1865620.shtml 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下 ...

  4. Linux下Makefile的automake生成全攻略

    From: http://fanqiang.chinaunix.net/system/linux/2005-12-14/3926.shtml 作为Linux下的程序开发人员,大家一定都遇到过Makef ...

  5. automake连载--Linux下使用autoconfig automake进阶

    http://blog.csdn.net/shanzhizi/article/details/30247325 前言:        这次task,我大概用了4天的时间去完成.四天的时间内,我不停地去 ...

  6. Linux下Makefile的automake生成全攻略[zz]

    By harry on Jan 18, 2008 文/余涛 (http://www.yesky.com/120/1865620.shtml) 作为Linux下的程序开发人员,大家一定都遇到过Makef ...

  7. CentOS下的Autoconf和AutoMake(实践篇) 2

    阅读过<Linux下的Autoconf和AutoMake(理论篇)>之后,进入到实践环节. 实验环境:CentOS release 6.7 (Final) x64 1.检查一下这4个工具是 ...

  8. Linux下使用GDAL进行开发(automake使用)

    首先写三个源代码文件,分别是GDALTest.cpp.Fun.cpp和Fun.h,将这三个存放在一个叫GDALTest的文件夹中,然后打开终端,切换到该目录,如下图所示(注:这个图是最后截图的,所以文 ...

  9. Linux下automake应用

    Linux下automake应用   linux 环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用 make 工具,自动进行编译安装,但是手写 makefile 文件比较复杂,所幸在 GN ...

最新文章

  1. JavaScript实现智能搜索框
  2. 这项技术厉害了!让旅行者 2 号从星际空间发首批数据!
  3. caffe matlab 提取全链接层特zheng
  4. pycharm 自动生成文件注释和函数注释
  5. FPI(公共标识符): owner//class description//language//version
  6. UNIX(多线程):01---线程简介及线程限制
  7. r语言msar如何用_如何在jupyter notebook中使用R语言
  8. UI组件-UIPickerView
  9. python基本词汇的特点_Python 爬完评论只会做词云?情感分析了解一下
  10. Spring SAS 0.2.0 上手教程
  11. 【错误记录】springboot项目报错Field xxx in com.xx.xx.xx.impl.xxImpl required a bean
  12. 多多客id是什么意思_【拼多多】关于多多客比价行为规范解释说明
  13. 银河麒麟安装Wine
  14. python 听歌识曲_Python实现提取谷歌音乐搜索结果的方法
  15. SpringBoot 文件上传(可配置文件上传路径)
  16. censo7安装mysql_centso7.2上mysql安装
  17. html用title属性实现鼠标悬停显示文字
  18. 电脑使用技巧(Win10修改窗口背景颜色)
  19. 2022出海东南亚:马来西亚电商市场现状及网红营销特点
  20. 金三银四,给大家肝一下面试~

热门文章

  1. 微信开发 调用摄像机拍照(录像)功能
  2. struts2中action的class属性值意义
  3. npm和gulp学习
  4. hadoop eclipse 插件
  5. TCP/IP笔记 应用层(2)——FTP
  6. android sdk 帮助文档下载地址
  7. C/C++ 存储类型 作用域 连接类型
  8. MySQL Root密码丢失解决方法总结
  9. 解决win7和ubuntu双系统ubuntu不能上网的问题
  10. Java Android未捕获异常处理机制