在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passwd 这些档案就是二进制程序代码。

  怎么产生一个可执行的二进制程序呢?首先写程序,用字处理器写完的程序即源代码,这个源代码就是一般的纯文本文档。在完成源代码的编写后,再来就是将程序代码编译成操作系统看得懂的binary program。编译需要编译程序来动作,经过编译程序的编译与连结之后,就可以产生一个可执行的二进制程序。举例来说,Linux上最标准的程序语言是c,我们用c来写源代码,用Linux上标准的c语言编译程序gcc来编译,然后生成可执行的binary program。

  有时候我们会在程序中引用其他外部子程序,或者利用其他软件提供的函数功能,我们就必须在编译的过程中,将函式库加进去,这样,编译程序可以将所有的程序代码与函式库作一个连结(Link)以产生正确的执行档(可执行binary program档案)。

  • make和configure

  • Tarball

  Tarball档案,其实就是将软件所有的原始代码档案先以tar打包,然后再以压缩技术来压缩,最常见的是gzip,所以tarball档案的扩展名是*.tar.gz或者*tgz。由于bzip2的压缩效率更佳,因此裆名也会变成*.tar.bz2。

  • 打印hello world

(1)直接以gcc编译原始码

  1. [root@localhost]# vi hello.c
  2. [root@localhost Documents]# cat hello.c
  3. #include <stdio.h>
  4. int main(void){
  5. printf("Hello World\n");
  6. }
  7. [root@localhost]# gcc hello.c
  8. [root@localhost]# ll
  9. total
  10. -rwxr-xr-x. root root Jun : a.out #编译成功的可执行binary program
  11. -rw-r--r--. root root Jun : hello.c
  12. [root@localhost]# ./a.out #执行文档
  13. Hello World

(2)产生目标文件来进行其他动作,而且执行的档名也不用预设的a.out

  1. [root@localhost]# gcc -c hello.c
  2. [root@localhost]# ll hello*
  3. -rw-r--r--. root root Jun : hello.c
  4. -rw-r--r--. root root Jun : hello.o #产生的目标文件
  5. [root@localhost]# gcc -o hello hello.o
  6. [root@localhost]# ll
  7. total
  8. -rwxr-xr-x. root root Jun : hello #可执行文件
  9. -rw-r--r--. root root Jun : hello.c
  10. -rw-r--r--. root root Jun : hello.o
    [root@localhost Documents]# ./hello
    Hello World

(3)子程序的编译

  1. [root@localhost]# vi thanks.c
  2. [root@localhost]# cat thanks.c
  3. #include <stdio.h>
  4. int main(void)
  5. {
  6. printf("Hello World\n");
  7. thanks_2(); #子程序
  8. }
  9. [root@localhost]# vi thanks_2.c
  10. [root@localhost]# cat thanks_2.c
  11. #include <stdio.h>
  12. void thanks_2(void)
  13. {
  14. printf("Thank you!\n");
  15. }
  16. [root@localhost]# ll thanks*
  17. -rw-r--r--. root root Jun : thanks_2.c
  18. -rw-r--r--. root root Jun : thanks.c
  19. [root@localhost]# gcc -c thanks.c thanks_2.c
  20. [root@localhost]# ll thanks*
  21. -rw-r--r--. root root Jun : thanks_2.c
  22. -rw-r--r--. root root Jun : thanks_2.o
  23. -rw-r--r--. root root Jun : thanks.c
  24. -rw-r--r--. root root Jun : thanks.o
  25. [root@localhost]# gcc -o thanks thanks.o thanks_2.o
  26. [root@localhost]# ll thanks*
  27. -rwxr-xr-x. root root Jun : thanks
  28. -rw-r--r--. root root Jun : thanks_2.c
  29. -rw-r--r--. root root Jun : thanks_2.o
  30. -rw-r--r--. root root Jun : thanks.c
  31. -rw-r--r--. root root Jun : thanks.o
  32. [root@localhost]# ./thanks
  33. Hello World
  34. Thank you!

(4)此外

  1. [root@localhost]#gcc -O hello.c -c #会自动产生hello.o,并且进行优化
  2. [root@localhost]#gcc -o hello hello.c -Wall #加入-Wall,程序的编译会变的较为严谨,警告信息会显示出来

用gcc进行程序的编译的更多相关文章

  1. 【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程

    一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...

  2. gcc 学习笔记(一) - 编译C程序 及 编译过程

    一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...

  3. 关于一个程序的编译过程 zkjg面试

    http://blog.csdn.net/gengyichao/article/details/6544266 一 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码 )转换成可以 ...

  4. GCC 4.8.2 编译安装

      https://my.oschina.net/u/728245/blog/184550 摘要: GCC 4.8.2 在 CentOS 6.5 下编译安装小记,遇到一些问题并解决. 以前从没有升级过 ...

  5. 附录三 嵌入式C程序的编译与调试

    课程回顾 C语言库的特性和发展 C语言库的常用库函数 标准库函数的特色应用 git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysi ...

  6. Linux C程序的编译过程

    Linux C程序的编译过程 学习一门语言程序,本人觉得还是得学习它的编译规则,现在,通过小例子小结下自己对C编译的认识. /*test.c     了解C程序的编译*/ #include <s ...

  7. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C+ ...

  8. Linux - gcc 的简易用法 (编译、参数与链结)

    # 仅将原始码编译成为目标档,并不制作连结等功能: [root@www ~]# gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档. # 在 ...

  9. gcc/g++ 实战之编译的四个过程

    gcc和g++分别是GNU(一个开源组织)的c&c++编译器   对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序:对于.cpp后缀的文件,gcc和g++都会当做c++程序. ...

随机推荐

  1. AngularJS实例实战

    学习了这么多天的AngularJS,今天想从实战的角度和大家分享一个简单的Demo--用户查询系统,以巩固之前所学知识.功能需求需要满足两点 1.查询所有用户信息,并在前端展示 2.根据id查询用户信 ...

  2. DOM对象模型接口规范中的四个基本接口

    DOM对象模型的四个基本接口 在DOM对象模型接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap.在这四个基本接口中,Document接口是对文档进 ...

  3. mysql sleep进程过多,应用级配置

    <property name="hibernateProperties"> <props> <prop key="hibernate.dia ...

  4. Entity Framework 6 Recipes 2nd Edition(12-5)译 -> 自动删除相关联实体

    12-5. 自动删除相关联实体 问题 当一个实体被删除时,你想自动删除它相关联的实体 解决方案 假设你有一个表结构由一个course (科目), course 的classes (课程),以及enro ...

  5. Html5 简单选择排序演示

    简单选择排序,是选择排序算法的一种.基本思想:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止.由于在每次循环中,会对数值相等的元素改变位置,所以属于非稳定 ...

  6. MySQL有趣的查询方式

    背景介绍 美国大选开始了,国防部要求我对两个总统候选人的票数进行统计.我首先简单的进行一次无条件查询,了解了一下表格的结构及所有数据长什么样子. select * from foo 查询到的结果令我很 ...

  7. C# 深拷贝的具体代码的封装与调用

    先封装下实现方法: public class DeepClone { public static object CopyObject(Object obj) { if (obj == null) { ...

  8. .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    .Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...

  9. webpack+react+es6开发模式

    一.前言 实习了两个月,把在公司用到的前端开发模式做个简单的整理.公司里前端开发模式webpack+react+redux+es6,这里去掉了redux. webpack, react, redux等 ...

  10. mysql数据库开发常见问题及优化

    mysql 数据库是被广泛应用的关系型数据库,其体积小.支持多处理器.开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高.在使用 mysql 的过程中不规范的 SQL 编写.非最优的 ...