作者:宅学部落
链接:https://www.zhihu.com/question/23893390/answer/832610610
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在Windows环境下,你使用IDE写一个简单的hello.c。然后按下F11,直接编译运行,然后在你的源码目录下会自动生成一坨杂七杂八的各种文件,你根本不知道这些文件是干嘛用的,对不对?甚至你不知道你运行的hello程序到底是怎么生成的。

但是在Linux下面就不一样了,你可以知道程序编译的每一个过程、细节,你甚至可以控制程序编译的每一个过程!

就以你的hello.c为例:一般来讲,从一个C语言源文件,到生成最后的可执行文件,流程如下;

  1. C 源文件: 使用vim编写一个简单的helloworld程序
  2. 预处理:生成预处理后的C源文件 hello.i
  3. 编译:将C源文件翻译成汇编文件 hello.s
  4. 汇编:将汇编文件汇编成目标文件 hello.o
  5. 链接:将目标文件链接成可执行文件

在Linux下面,可以就可以通过gcc命令精确控制每一个编译、链接过程

$  gcc  -E  hello.c  >  hello.i           //会生成预处理后的C源文件hello.i
$  gcc  -S  hello.i                       //将hello.i编译成汇编文件hello.s
$  gcc  -c  hello.s                       //将汇编文件hello.s汇编成hello.o
$  gcc hello.o  -o hello                  //将目标文件链接成可执行文件hello
$  ./hello                               // 运行可执行文件hello 

按照上面的流程做一遍,你就知道了程序编译、链接的每一个过程,而且可以控制它~,如果有兴趣,我们甚至还可以反汇编我们的可执行程序:

$ objdump  -D   hello   >  hello.S

看到没,我们可以将一个二进制可执行文件,通过反汇编,生成汇编文件,然后去研究它。

看到这里,你可能会抬杠了:但是在Linux下敲命令很麻烦啊,每次敲来敲去,哪有在Windows下按一下F11方便!

别急,在Linux下我们也可以使用快捷键:make命令

在你的hello.c 文件目录下创建一个Makefile文件,添加以下内容:

hello:hello.c
    gcc hello.c -o hello

修改后保存退出vim,然后在当前目录下敲击命令:$ make

你会发现,make会自动编译你的源程序,在当前目录下生成可执行文件:hello。如果你想往这个项目添加新的C源文件main.c时,你可以直接修改这个Makefile,然后就直接make编译就行了。

hello:hello.c main.c
    gcc hello.c -o hello main.c

如果你嫌每次修改Makefile麻烦,我们可以重新写一个新的Makefile,自动搜索我们当前目录下的所有C源程序文件、编译、链接,生成可执行文件:

.PHONY:all clean
SRCS = $(wildcard *.c)
EXE  = hello
all: $(EXE)
$(EXE):$(SRCS)
    gcc -o $@ $^
clean:
    rm -f $(EXE)

使用上面的Makefile,你在Makefile所在的当前目录下添加新的C源文件,然后make,你会发现make会自动编译你当前目录下的所有C文件。

其实,在Windows下的各种集成开发环境(IDE),如你所说的DEV C++,包括VC++ 6.0,其实它们底层也是靠make/makefile来编译程序的。只不过名字、规则稍微不一样而已,如在VC++6.0的安装包下面,你会找到类似的一个叫做nmake的EXE文件,其实它就相当于Linux环境下的make。

小结:

在Linux下学习C语言,我们可以通过底层命令熟悉程序编译、链接的具体过程,甚至可以控制、优化编译流程。而在Windows下面,使用带界面的集成开发环境(IDE),集程序的编辑、编译、链接、调试于一体,一条龙服务,交互功能友好。可以更方便我们开发。

环境使用建议:

如果你以后想从事C++/Java桌面开发,学习C语言只是你的一个过渡、打基础阶段。那么建议在Windows下使用各种IDE开发工具学习C语言。

如果你以后想从事Linux环境下的C语言开发、嵌入式开发,建议从一开始,就在Linux环境下学习C语言。

在 Linux 下学习 C 语言有什么好处?的更多相关文章

  1. 在Linux下开始C语言的学习

    为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查 ...

  2. linux下的C语言开发 进程创建 延伸的几个例子

    在Linux下面,创建进程是一件十分有意思的事情.我们都知道,进程是操作系统下面享有资源的基本单位.那么,在linux下面应该怎么创建进程呢?其实非常简单,一个fork函数就可以搞定了.但是,我们需要 ...

  3. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  4. Linux下的C语言编程

    一.在Linux下的C语言编程所需工具(下面所列举的都是我编程所用的工具) 1.文本编辑器 Vim 2.编译链接工具 gcc 3.调试器 gdb 4.项目管理工具 make和makefile 二.VI ...

  5. Windows下学习C语言有哪些集成开发软件?

    前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之后熟悉一些可以在慢慢 ...

  6. windows下的c语言和linux 下的c语言以及C标准库和系统API

    1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作 ...

  7. 在Linux下运行C语言程序

    市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Deepin(深度Linux).本教 ...

  8. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  9. Linux下查看Go语言软件运行情况

    在Linux下,使用"jps"可以查看用Java语言写的软件的运行情况,如果要查看GO语言写的软件的运行情况,可以使用"gops",但这不是系统自带的,需要进行 ...

随机推荐

  1. React一键复制

    如题,我们怎么在React或者其他的框架中实现一键复制呢,实际上实现一键复制的代码与框架无关,因为他是用的是原生的API,下面我们用React来实现一下    效果: 核心代码: 直接将红框处改为需要 ...

  2. EFK的搭建(未完成)

    EFK 是ELK 日志分析的一个变种,能够更好的来实现日志分析. 首先我们先准备3台 centos7的服务器,在给他们调成2核2G的状态打开. 软件 版本号 zookeeper 3.4.14 Kafk ...

  3. VUEday01

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 《MySQL数据库》常用语法(一)

    MySQL从创建数据库到对表的增删改操作汇总. 1. 数据库操作: -- 查看所有的数据库 SHOW DATABASES ; -- 创建一个数据库,XXX表示数据库名称 CREATE DATABASE ...

  5. 《Dotnet9》系列-Google ProtoBuf在C#中的简单应用

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  6. JS---BOM基本知识 (顶级对象,系统对话框,加载事件,location对象, history对象, navigator对象)

    BOM JavaScript分三个部分: 1. ECMAScript标准---基本语法 2. DOM--->Document Object Model 文档对象模型,操作页面元素的 3. BOM ...

  7. Crow’s Foot Notation

    http://www2.cs.uregina.ca/~bernatja/crowsfoot.html Crow’s Foot Notation A number of data modeling te ...

  8. java开发,入职半年。对未来迷茫,如何发展

    蛮多人私密我一些问题,关于面试,关于技术的,我只能说有些路只能靠自己去走,没人可以帮到自己,哪怕偶尔帮一到两次,但是技术的路这么长,总归需要自己独自成长的.附一张自己藏书的照片,与各位共勉 工作三年多 ...

  9. weed3-1.hello world

    Weed3 一个微型ORM框架(只有0.1Mb哦) 源码:https://github.com/noear/weed3 源码:https://gitee.com/noear/weed3 05年的时候开 ...

  10. java bean 属性验证框架 valid

    项目介绍 java 开发中,参数校验是非常常见的需求. 但是 hibernate-validator 在使用过程中,依然会存在一些问题. 特性 支持 fluent-validation 支持 jsr- ...