UPDATE: 该内容有点含混不清,请看最后。
我一直对C/C++编译时的一些概念不太清楚,主要也是没有系统地去了解过,一直都是零散的接触。
我在编译一些老旧程序时,经常会遇到调用ld
和cpp
这两个程序的,我一直搞不懂它们是干什么用的。经过学习,我大概知道它们是干什么的了。
要注意的是,我们这里所说的cpp
指的是The C Preprocessor,而不是C++。而ld
指的是The GNU linker。
我一直搞不懂的是,编译器已经能实现这两个功能了,为什么还要去调用ld
和cpp
呢?事实上我的这种想法确实也没错。
其实,我们在使用gcc
进行编译的时候,它就会使用cpp
进行预编译,在链接时会调用ld
。不过在调用ld
的时候可能行为上会有些差别,有可能会出现gcc
会自动地链接某些库,而ld
需要手动指定的情况。
事实上我们gcc
中也可以单独调用ld
和cpp
的功能。对于ld
来说,我们直接把.o
文件作为gcc
参数即可,而cpp
我们可以直接gcc -E
。
另外,这对于g++
也是一样的。
编译流程一般是cpp -> cc1 -> as -> ld
,分别是预处理,编译,汇编,链接。常说的编译器例如gcc通常是这些工具的合集,通过加参数可以指定使用其中哪些工具。不加任何参数就是走完所有的流程了。但是ld不是GCC的组成部分。
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。