OpenJDK系列(四):从JVM谈C/C++编译流程

本文介绍了C/C++编译流程,包括预编译、编译、汇编和链接四个阶段,并探讨了gcc、g++、LLVM、Clang的区别与联系,以及GDB和LLDB的调试工具。文章还讨论了C++编译器的历史,如GCC和Clang的演变,以及Apple公司在其中的角色。最后,文章强调了Clang相对于GCC的优势,并概述了Mac OS中gcc和clang的使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译器的这点事

gcc和g++还傻傻分不清楚?clang与gcc有什么关系?llvm又是什么?下面将对一些常见的名词进行说明以免在后续阅读中感到疑惑.

gcc和g++

gcc 即 GNU C Compiler, 刚开始它就是一个c编译器项目。后来越来越多的其他语言编译器也被添加到这个项目中,如用于编译c++代码的cc1plus.此时的gcc代表的是一堆编译器的集合(the GNU Compiler Collection).

现在编译系统中,我们执行的gcc已经不是特指当初的C语言编译器了,而是一个编译驱动程序:根据代码源文件后缀名来决定调用哪种的编译器或编译驱动器.比如后缀.c会调用c编译器(cc1)和链接器;如果后缀是.cpp则会调用g++(g++同样是一个驱动程序),g++最终会调用cc1plus编译器及链接器.用张图简单描述如下:

image-20180929111926694

需要注意上图只是用来描述gcc和g++的位置关系.对于HelloWorld.c文件,当然我们也可以直接用g++驱动器,那下述两种方式有什么区别么?

gcc HelloWorld.c -o HelloWorld.out
# 或
g++ HelloWorld.c -o HelloWorld.out
  • 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)

    比如以下代码:

    #include <stdio.h>
    
    int main(int argc, char* argv[]) {
         
         
    	if(argv == 0) return 0;
    	printDebug(argv);
    	return 0;
    }
    
    int printDebug(char* string) {
         
         
      sprintf(string, "debug\n");
    }
    

    如果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值