在 Linux 下学习 C 语言有什么好处?

作者:宅学部落
链接: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 下学习 C 语言有什么好处?_第1张图片 在 Linux 下学习 C 语言有什么好处?_第2张图片 在 Linux 下学习 C 语言有什么好处?_第3张图片 在 Linux 下学习 C 语言有什么好处?_第4张图片

在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 语言有什么好处?)