03月17, 2018

C/C++编译时的ld和cpp

UPDATE: 该内容有点含混不清,请看最后。

我一直对C/C++编译时的一些概念不太清楚,主要也是没有系统地去了解过,一直都是零散的接触。

我在编译一些老旧程序时,经常会遇到调用ldcpp这两个程序的,我一直搞不懂它们是干什么用的。经过学习,我大概知道它们是干什么的了。

要注意的是,我们这里所说的cpp指的是The C Preprocessor,而不是C++。而ld指的是The GNU linker。

我一直搞不懂的是,编译器已经能实现这两个功能了,为什么还要去调用ldcpp呢?事实上我的这种想法确实也没错。

其实,我们在使用gcc进行编译的时候,它就会使用cpp进行预编译,在链接时会调用ld。不过在调用ld的时候可能行为上会有些差别,有可能会出现gcc会自动地链接某些库,而ld需要手动指定的情况。

事实上我们gcc中也可以单独调用ldcpp的功能。对于ld来说,我们直接把.o文件作为gcc参数即可,而cpp我们可以直接gcc -E

另外,这对于g++也是一样的。


编译流程一般是cpp -> cc1 -> as -> ld,分别是预处理,编译,汇编,链接。常说的编译器例如gcc通常是这些工具的合集,通过加参数可以指定使用其中哪些工具。不加任何参数就是走完所有的流程了。但是ld不是GCC的组成部分。

本文链接:https://debug.fanzheng.org/post/ld-and-cpp-in-C-and-CPP.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。