clang代替gcc

2024-03-17 11:58
文章标签 clang gcc 代替

本文主要是介绍clang代替gcc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为需要研究的别人的代码里用到了clang++,所以在此记录一下。转载自:无求备斋笔记

 

gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 编译器。gcc 是 GNU 亲儿子,Ubuntu 等常用发行版标配。clang 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在已经是 Mac(XCode) 的默认编译器,微软等大公司都在往上靠,前景一片光明。知乎上对几个主流编译器的评价:

(1)前景最好的应该是clang,错误提示/编译速度都是一流。另外现在有很多代码自动完成/提示工具是基于clang的。clang编译出的debug文件已经可以用gdb调试了哈,vs2015也内置了clang来提供对cross platfrom的支持。

(2)gcc/g++/msvc因为面向了具体的platform,所以老的项目里面可能用了他们自带的扩展/或者在彼此应用环境下有一些best practice,这个没有办法,还得接着用。。。

(3)Borland?还活着?

(4)ICC,据说经ICC编译后效率有提高,即使是AMD的U也是这样。。。我没试过。。。

对我自己而言,优先级是clang>g++>msvc。

 

OK,那么 clang 如何优秀呢,测试一下。测试平台 Ubuntu 15.04. 安装方法:

sudo apt-get install llvm
sudo apt-get install clang

切换默认 C++ 编译器:

sudo update-alternatives --config c++
There are 2 choices for the alternative c++ (providing /usr/bin/c++).Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/g++       20        auto mode
1            /usr/bin/clang++   10        manual mode
2            /usr/bin/g++       20        manual modePress enter to keep the current choice[*], or type selection number: 1

对于 C 语言:

sudo update-alternatives --config cc

流程同 C++。

用拼写错误的变量名来测试一下 gcc 和 clang 的前端提示。

gcc 提示:

clang 提示:

仅仅在这个例子中,可以看到 clang 优于 gcc 的地方有

  1. 优美的颜色高亮。单色 gcc 看着真累。

  2. 智能的提示。clang 不仅告知有未定义变量,且知道可能是拼写出错,并提示可能的正确变量在哪。

  3. 更优异的大局观。本例子中拼写错误出现在 return 语句里,由于 return 语句编译出错,gcc 还抛出一个 non-void function 可能缺少 return 语句的 warning (明明我的 return 语句已经写在那里了)。clang 则知道 return 语句在那里,不会抛出这个没有必要的 warning。

目前我使用 clang 碰到的问题是,编译使用 boost 库的项目,运行时直接 Segmentation Fault,g++ 则无此问题。现在我直接使用 C++ 11 的多线程 API,不用 boost,于是仍用 clang 愉快地玩耍。

这篇关于clang代替gcc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818885

相关文章

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

17 通过ref代替DOM用来获取元素和组件的引用

重点 ref :官网给出的解释是: ref: 用于注册对元素或子组件的引用。引用将在父组件的$refs 对象下注册。如果在普通DOM元素上使用,则引用将是该元素;如果在子组件上使用,则引用将是组件实例: <!-- vm.$refs.p will be the DOM node --><p ref="p">hello</p><!-- vm.$refs.child will be the c

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

【linux学习指南】Linux编译器 gcc和g++使用

文章目录 📝前言🌠 gcc如何完成🌉预处理(进行宏替换) 🌠编译(生成汇编)🌉汇编(生成机器可识别代码) 🌠链接(生成可执行文件或库文件)🌉函数库 🌠gcc选项🚩总结 📝前言 预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)连接(生成可执行文件或库文件) 🌠 gcc如何完成 格式 :gcc [选项] 要编译的文件 [选项] [目标文

gcc编译常见问题

inux C gcc -lm     使用 math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项 ,因为数学函数位于 libm.so 库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。本书用到的大部分库函数(例如printf)位于 libc.so 库文件中,使用libc.so中的库函数在编译时不需要加-l

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g++ 编译2.5 运行可执行文件 GCC编译器 GCC(GNU Compiler Collection)是一个开源编译器集

gcc 编译器对 sqrt 未定义的引用

man sqrt  Link with -lm. gcc -o test test.c -lm 原因:缺少某个库,用 -l 参数将库加入。Linux的库命名是一致的, 一般为 libxxx.so, 或 libxxx.a, libxxx.la, 要链接某个库就用   -lxxx,去掉头 lib 及 "." 后面的 so, la, a 等即可。 常见的库链接方法为

servlet用反射代替if..else

String methodName = request.getParameter("method"); Method method = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, request, re

linux编译器——gcc/g++

1.gcc linux上先要安装, sudo yum install gcc gcc --version 可以查看当前的版本 ,我们默认安装的是4.8.5的版本,比较低, gcc test.c -std=c99 可以使他支持更高版本的c标准 -o 可以殖指明生成文件的名字,可以自己命名,比如 gcc test.c -o my.exe -std=c99 或者 gcc -o my.exe