在 Linux 下学习 C 语言有什么好处?
链接:https://www.zhihu.com/question/23893390/answer/832610610
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在Windows环境下,你使用IDE写一个简单的hello.c。然后按下F11,直接编译运行,然后在你的源码目录下会自动生成一坨杂七杂八的各种文件,你根本不知道这些文件是干嘛用的,对不对?甚至你不知道你运行的hello程序到底是怎么生成的。
但是在Linux下面就不一样了,你可以知道程序编译的每一个过程、细节,你甚至可以控制程序编译的每一个过程!
就以你的hello.c为例:一般来讲,从一个C语言源文件,到生成最后的可执行文件,流程如下;
- C 源文件: 使用vim编写一个简单的helloworld程序
- 预处理:生成预处理后的C源文件 hello.i
- 编译:将C源文件翻译成汇编文件 hello.s
- 汇编:将汇编文件汇编成目标文件 hello.o
- 链接:将目标文件链接成可执行文件




在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 语言有什么好处?的更多相关文章
- 在Linux下开始C语言的学习
为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查 ...
- linux下的C语言开发 进程创建 延伸的几个例子
在Linux下面,创建进程是一件十分有意思的事情.我们都知道,进程是操作系统下面享有资源的基本单位.那么,在linux下面应该怎么创建进程呢?其实非常简单,一个fork函数就可以搞定了.但是,我们需要 ...
- Linux 下 expect 脚本语言中交互处理常用命令
Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...
- Linux下的C语言编程
一.在Linux下的C语言编程所需工具(下面所列举的都是我编程所用的工具) 1.文本编辑器 Vim 2.编译链接工具 gcc 3.调试器 gdb 4.项目管理工具 make和makefile 二.VI ...
- Windows下学习C语言有哪些集成开发软件?
前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之后熟悉一些可以在慢慢 ...
- windows下的c语言和linux 下的c语言以及C标准库和系统API
1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作 ...
- 在Linux下运行C语言程序
市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Deepin(深度Linux).本教 ...
- Linux下简单C语言小程序的反汇编分析
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...
- Linux下查看Go语言软件运行情况
在Linux下,使用"jps"可以查看用Java语言写的软件的运行情况,如果要查看GO语言写的软件的运行情况,可以使用"gops",但这不是系统自带的,需要进行 ...
随机推荐
- 关于eclipse码代码时光标自动消失要重新点击输入框的问题
前几天码代码时在两个电脑都出现了同样的问题,就是在输入的时候,输入法突然从程序框切换到某不可名状的位置,要重新点击输入框才能解决.(后发现不但是eclipse,任何带有输入框的都会出现此问题) 经排查 ...
- linux,centos,php,word转图片方法
刚开始的时候是客户的活儿,真的是没有想到,被这样一个方法给卡住了,真是醉了,经过漫长的一周,终于搞定了这个问题,以下就来给大家介绍以下这个方法把.能方便大家. (直接转换没办法,所以找了个折中的办法, ...
- 《Java知识应用》Java发送邮件(QQ,163)
1 准备 Jar包下载地址: 链接: https://pan.baidu.com/s/1kFZgWRR8yZaQH_baf6tzAg 提取码: x2e8 邮箱:授权码 2.案例: 通过QQ邮箱服务器 ...
- Java并发之synchronized关键字深度解析(三)
前言 本篇主要介绍一下synchronized的批量重偏向和批量撤销机制,属于深水区,大家提前备好氧气瓶. 上一篇说完synchronized锁的膨胀过程,下面我们再延伸一下synchronized锁 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- python函数编程-偏函数partial function
一般的,通过设定函数参数的默认值,可以减低函数调用的难度.比如:int()函数可以把字符串转换成整数: >>> int(') 123 事实上,int()函数还提供额外的base参数, ...
- SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载)
场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Android utils 工具类之MD5加密 MD5Utils
实际开发过程中,密码不会保存明文形式,容易被别人窃取. MD5加密是不可逆的加密算法,只能由明文转换成密文. 但是有些人通过将明文对应的密文保存在数据库中,进行查询破解密文.为防止这种解密,根据许多对 ...
- 智能家居手势识别,只需百度AI即可搞定
上次我尝试做了一个给眼镜加特效,针对的是静态图像,具体文章参考 https://ai.baidu.com/forum/topic/show/942890 . 这次我尝试在视频中加眼镜特效,并且加上手势 ...
- Oracle转SqlServer
基础数据所对应的类型不同 在Oracle中有一些基础类型与Sqlserver中名字一样,但是所存储的数据格式不同,Date类型在Oracle中精确到秒,在Sqlserver中只能精确到天 表的结构 O ...