clang编译c
‘壹’ Clang 比 GCC 编译器好在哪里
1:Clang编译速度更快、编译产出更小、出错提示更友好。
2:clang还内置有静态分析工具,可以对代码进行静态分析(clang --analyze)。这是gcc做不到的。
3:clang结构更简单。因为clang只需要完成词法和语法分析,代码优化和机器代码的生成工作由llvm完成。所以和全部由自己包下的gcc比起来,clang可以更专注地做好一件事。
4:Clang 的另一个优势是代码结构清晰,可以作为库使用,成为其它 app(主要是 IDE)的内嵌 C/C++ parser。这样,editor 工具可以使用和 compiler 一样的 parser 来完成 edit-time 的语法检查。GCC 的结构比较混乱。业界一直有说法是 FSF 故意如此,以便让 GCC 无法作为其它 app 的内嵌部分。
5:Clang采用的是BSD协议。这是苹果资助LLVM、FreeBSD淘汰GCC换用Clang的一个重要原因。
‘贰’ 目前主流的c语言编译软件是什么
C语言相比其他很多新兴的、复杂的语言,语法还是简单一些,较好实现的。
所以在C语言几十年的发展中出现了各式各样的编译器,还有一些容易被误解为编译器的IDE。
这里列举几个主流的:
GCC
毫无疑问,GCC几乎是unix及linux系统中最通用的编译器套件,几乎所有的linux发行版都预装了GCC作为C语言的默认编译器。除了对C语言的支持,GCC还支持C++、Objective-C等多种语言。GCC早在1987就由Richard Stallman作为GNU计划的一部分发布。
Clang
Clang是近几年新兴的C/C++以及Objective-C的编译器,Apple是其主要投资者,其最初的开发者已加盟Apple。虽说是新兴,但其对C/C++标准的支持不亚于GCC等老牌编译器,并且外部接口和GCC完全兼容,并且因其模块化、错误提示完善等优点已经越来越受到重视。一些如FreeBSD等项目已将clang作为默认编译器。
其实Clang并不是一个完整的编译器,而是作为同一批开发者开发的另一个备受关注的虚拟机(类似于JVM)的llvm的一个前端开发,只是负责将C语言源码编译为llvm IR的中间语言,再由llvm编译为目标代码,这样做可以让其可移植性更好。
Microsoft Visual C++
作为拥有可视化集成编程系统的编译器,VC被很多使用Windows作为开发环境的初学者使用。详见网络的介绍
http://ke..com/view/2070966.htm?fromtitle=vc&fromid=7792954&type=syn#viewPageContent
‘叁’ clang 编译不过去这个是什么原因
1,Buildllvm/clang/lldb/lld3.5.0等组件1.0准备:至少需要从llvm.org下载llvm,cfe,lldb,compiler-rt,lld等3.5.0版本的代码。$tarxfllvm-3.5.0.src.tar.gz$cdllvm-3.5.0.src$mkdir-ptools/clang$mkdir-ptools/clang/tools/extra$mkdir-ptools/lld$mkdir-pprojects/compiler-rt$tarxfcfe-3.5.0.src.tar.xz-Ctools/clang--strip-components=1$tarxfcompiler-rt-3.5.0.src.tar.xz-Cprojects/compiler-rt--strip-components=1$tarxflldb-3.5.0.src.tar.xz-Ctools/clang/tools/extra--strip-components=1$tarxflld-3.5.0.src.tar.xz-Ctools/lld--strip-components=11.1【可选】使用clang--stdlib=libc++时,自动添加-lc++abi。libc++组件可以使用gcclibstdc++的supc++ABI,也可以使用c++abi,cxxrt等,实际上自动添加-lc++abi是不必要的,这里这么处理,主要是为了方便起见。实际上完全可以在“clang++-stdlib=libc++”时再手工添加-lc++abi给链接器。这里涉及到链接时DSO隐式还是显式的问题,早些时候ld在链接库时会自动引入由库引入的依赖动态库,后来因为这个行为的不可控性,所以ld链接器的行为做了修改,需要显式的写明所有需要链接的动态库,才会有手工添加-lc++abi这种情况出现。---llvm-3.0.src/tools/clang/lib/Driver/ToolChain.cpp2012-03-2618:49:06.663029075+0800+++llvm-3.0.srcn/tools/clang/lib/Driver/ToolChain.cpp2012-03-2619:36:04.260071355+0800@@-251,6+251,7@@switch(Type){caseToolChain::CST_Libcxx:CmdArgs.push_back("-lc++");+CmdArgs.push_back("-lc++abi");break;caseToolChain::CST_Libstdcxx:1.2【必要】给clang++添加-fnolibgcc开关。这个开关主要用来控制是否连接到libgcc或者libunwind。注:libgcc不等于libunwind。libgcc_eh以及supc++的一部分跟libunwind功能相当。注:libgcc_s和compiler_rt的一部分相当。这个补丁是必要的,不会对clang的正常使用造成任何影响,只有在使用“-fnolibgcc"参数时才会起作用。之所以进行了很多unwind的引入,主要是为了避免不必要的符号缺失麻烦,这里的处理相对来说是干净的,通过as-needed规避了不必要的引入。---llvm-static-3.5.0.bak/tools/clang/lib/Driver/Tools.cpp2014-09-1013:46:02.581543888+0800+++llvm-static-3.5.0/tools/clang/lib/Driver/Tools.cpp2014-09-1016:03:37.559019321+0800@@-2060,9+2060,15@@".a");CmdArgs.push_back(Args.MakeArgString(LibClangRT));-CmdArgs.push_back("-lgcc_s");-if(TC.getDriver().CCCIsCXX())-CmdArgs.push_back("-lgcc_eh");+if(Args.hasArg(options::OPT_fnolibgcc)){+CmdArgs.push_back("--as-needed");+CmdArgs.push_back("-lunwind");+CmdArgs.push_back("--no-as-needed");+}else{+CmdArgs.push_back("-lgcc_s");+if(TC.getDriver().CCCIsCXX())+CmdArgs.push_back("-lgcc_eh");+}}staticvoidaddProfileRT(@@-7150,24+7156,50@@boolisAndroid=Triple.getEnvironment()==llvm::Triple::Android;boolStaticLibgcc=Args.hasArg(options::OPT_static_libgcc)||Args.hasArg(options::OPT_static);+++if(!D.CCCIsCXX())-CmdArgs.push_back("-lgcc");+if(Args.hasArg(options::OPT_fnolibgcc)){+CmdArgs.push_back("--as-needed");+CmdArgs.push_back("-lunwind");+CmdArgs.push_back("--no-as-needed");+}else+CmdArgs.push_back("-lgcc");if(StaticLibgcc||isAndroid){if(D.CCCIsCXX())-CmdArgs.push_back("-lgcc");+if(Args.hasArg(options::OPT_fnolibgcc)){+CmdArgs.push_back("--as-needed");+CmdArgs.push_back("-lunwind");+CmdArgs.push_back("--no-as-needed");+}else+CmdArgs.push_back("-lgcc");}else{if(!D.CCCIsCXX())CmdArgs.push_back("--as-needed");-CmdArgs.push_back("-lgcc_s");+if(Args.hasArg(options::OPT_fnolibgcc))+CmdArgs.push_back("-lunwind");+else+CmdArgs.push_back("-lgcc_s");if(!D.CCCIsCXX())CmdArgs.push_back("--no-as-needed");}if(StaticLibgcc&&!isAndroid)-CmdArgs.push_back("-lgcc_eh");+if(Args.hasArg(options::OPT_fnolibgcc)){+CmdArgs.push_back("--as-needed");+CmdArgs.push_back("-lunwind");+CmdArgs.push_back("--no-as-needed");+}else+CmdArgs.push_back("-lgcc_eh");elseif(!Args.hasArg(options::OPT_shared)&&D.CCCIsCXX())-CmdArgs.push_back("-lgcc");+if(Args.hasArg(options::OPT_fnolibgcc)){+CmdArgs.push_back("--as-needed");+CmdArgs.push_back("-lunwind");+CmdArgs.push_back("--no-as-needed");+}else+CmdArgs.push_back("-lgcc");//AccordingtoAndroidABI,wehavetolinkwithlibdlifweare//linkingwithnon-staticlibgcc.---llvm-static-3.5.0.bak/tools/clang/include/clang/Driver/Options.td2014-08-0712:51:51.000000000+0800+++llvm-static-3.5.0/tools/clang/include/clang/Driver/Options.td2014-09-1013:36:34.598511176+0800@@-788,6+788,7@@deffomit_frame_pointer:Flag,Group;deffopenmp:Flag,Group,Flags;deffopenmp_EQ:Joined,Group,Flags;+deffnolibgcc:Flag,Group,Flags;deffno_optimize_sibling_calls:Flag,Group;deffoptimize_sibling_calls:Flag,Group;defforce__cpusubtype__ALL:Flag;1.3llvm的其他补丁。llvm/clang将gcctoolchain的路径hardcode在代码中,请查阅tools/clang/lib/Driver/ToolChains.cpp。找到x86_64-redhat-linux之类的字符串。如果没有你系统特有的gcctripplestring,请自行添加。这个tripplestring主要是给llvm/clang搜索gcc头文件等使用的,不影响本文要构建的toolchain1.4构建clang/llvm/lldb本文使用ninja。顺便说一下,llvm支持configure和cmake两种构建方式。可能是因为工程太大,这两种构建方式的工程文件都有各种缺陷(主要表现在开关选项上,比如configure有,但是cmake却没有等)。llvm-3.4.1就是因为cmake工程文件的错误而导致了3.4.2版本的发布。综合而言,cmake+ninja的方式是目前最快的构建方式之一,可以将构建时间缩短一半以上。mkdirbuildcdbuildcmake\-GNinja\-DCMAKE_INSTALL_PREFIX=/usr\-DCMAKE_BUILD_TYPE="Release"\-DCMAKE_CXX_FLAGS="-std=c++11"\-DBUILD_SHARED_LIBS=OFF\-DLLVM_ENABLE_PIC=ON\-DLLVM_TARGETS_TO_BUILD="all"\-DCLANG_VENDOR="MyOS"..ninjaninjainstall如果系统原来就有clang/clang++的可用版本,可以添加:-DCMAKE_C_COMPILER=clang\-DCMAKE_CXX_COMPILER=clang++\这样就会使用系统的clang++来构建llvm/clang2,测试clang/clang++。自己找几个简单的c/cpp/objc等编译测试一下即可。完整测试可以在构建时作ninjacheck-all3,libunwind/libc++/libc++abi,一套不依赖libgcc,libstdc++的c++运行库。3.1从/pathscale/libunwind获取代码。libunwind有很多个实现,比如gnu的libunwind,path64的libunwind,还有libcxxabi自带的Unwinder.这里作下说明:1),gnu的libunwind会有符号缺失和冲突。2),libcxxabi自带的Unwinder是给mac和ios用的,也就是只能在darwin体系构建。目前Linux的实现仍然不全,等linux实现完整了或许就不再需要path64的unwind实现了。暂时建议使用pathscale的unwind实现。mkdir-pbuildcdbuildcmake-GNinja-DCMAKE_C_COMPILER=clang-DCMAKE_C_FLAGS="-m64"..ninjamkdir-p/usr/libcpsrc/libunwind.so/usr/libcpsrc/libunwind.a/usr/lib3.2第一次构建libcxx.必须先构建一次libcxx,以便后面构建libcxxabi。这里构建的libcxx实际上是使用gcc的libgcc/stdc++/supc++的。打上这个补丁来禁止libgcc的引入:diff-Nurlibcxx/cmake/config-ix.cmakelibcxxn/cmake/config-ix.cmake---libcxx/cmake/config-ix.cmake2014-06-2506:57:50.000000000+0800+++libcxxn/cmake/config-ix.cmake2014-06-2509:05:24.980350544+0800@@-28,5+28,4@@check_library_exists(cprintf""LIBCXX_HAS_C_LIB)check_library_exists(mccos""LIBCXX_HAS_M_LIB)check_library_exists(rtclock_gettime""LIBCXX_HAS_RT_LIB)-check_library_exists(gcc_s__gcc_personality_v0""LIBCXX_HAS_GCC_S_LIB)编译安装:mkdirbuildcdbuildcmake\-GNinja\-DCMAKE_INSTALL_PREFIX=/usr\-DCMAKE_C_COMPILER=clang\-DCMAKE_CXX_COMPILER=clang++\..ninjaninjainstall3.3,测试第一次构建的libcxx。使用"clang++-stdlib=libc++-otesttest.cpp-lstdc++"编译简单c++代码,检查是否出错。(如果前面构建clang是已经apply了c++abi的链接补丁,这里会出现找不到c++abi的情况,跳过即可)使用"lddtest"查看test二进制动态库使用情况。可以发现,test依赖于libgcc_s/libc++/libstdc++。(多少有些不爽了吧?使用了libc++居然还要依赖libstdc++?)
‘肆’ 在terminal下,利用gcc和clang编译C源文件的时候,出现linker command failed 该怎么修复
设置PATH和 LIB的PATH
‘伍’ GCC/G++,ICC,Clang,MSVC,BCC等C/C++编译器有什么特长和不足
clang编译速度快,但是貌似编译结果运行相对会慢。功能更新一般也比较快。
g++编译速度比clang慢,编译结果运行貌似比clang快。功能更新稍慢。
vc这几年没编译过大工程,感觉上编译速度在clang和g++之间。以过去的经验g++和vc编译结果运行速度差不多。功能更新上就是一坨屎。但是在Windows上写点正经东西你可能不得不用它,相对的你也只能在Windows上用它。
icc很久没用过,过去印象编译速度很慢,运行速度最快但是感觉有点得不偿失。最大的问题是这东西要钱,前三个都是免费的。
bcc直接无视就好了。
‘陆’ c语言编译器是用什么语言编写的
C++
比较着名,并且开源的C编译器有GCC、clang等,目前GCC和clang都是用C++实现的
‘柒’ 如何让clang编译C代码的时候,错误提示有颜色
1. 无选项编译链接
> 用法: gcc test.c
> 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。
2. 选项 -o 第四步 链接(Linking)
> 用法: gcc test.c -o test
> 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。
3. 选项 -E 第一步 预处理(Pre-Processing)
> 用法: gcc -E test.c -o test.i
> 作用:将test.c预处理输出test.i文件。
4. 选项 -S 第二步 编译(Compiling)
> 用法: gcc -S test.i
> 作用:将预处理输出文件test.i汇编成test.s文件。
5. 选项 -c 第三步 汇编(Assembling)
> 用法: gcc -c test.s
> 作用:将汇编输出文件test.s编译输出test.o文件。
6. 无选项链接
> 用法: gcc test.o -o test
> 作用:将编译输出文件test.o链接成最终可执行文件test。
7. 选项 -O
> 用法: gcc -O1 test.c -o test
> 作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
二. 多源文件的编译方法
1. 多个文件一起编译
> 用法:#gcc testfun.c test.c -o test
> 作用:将testfun.c和test.c分别编译后链接成test可执行文件。
2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
> 用法:
> gcc -c testfun.c //将testfun.c编译成testfun.o
> gcc -c test.c //将test.c编译成test.o
> gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test
‘捌’ 如何让clang支持C\C++
啊?我没弄懂你的意思,我只是想用clang来编译C++,他们这个上面有clang的C/C++的标准库文件,然后现在我的clang能编译C++,但是C++的标准库要编译,我就是编译他们这个标准库文件的时候,编译器报错说找不到string.h这个文件
‘玖’ 适合win10系统的c语言编译器
桌面操作系统
对于当前主流桌面操作系统而言,可使用 VisualC++、GCC以及 LLVM Clang 这三大编译器。
Visual C++(简称 MSVC)只能用于 Windows 操作系统;GCC 和 LLVM Clang除了可用于Windows操作系统之外,主要用于 Unix/Linux操作系统。
像现在很多版本的 Linux 都默认使用 GCC 作为C语言编译器,而像 FreeBSD、macOS 等系统默认使用 LLVM Clang 编译器。由于当前 LLVM 项目主要在 Apple 的主推下发展的,所以在 macOS中,Clang 编译器又被称为 Apple LLVM 编译器。
MSVC 编译器主要用于 Windows 操作系统平台下的应用程序开发,它不开源。用户可以使用 Visual Studio Community 版本来免费使用它,但是如果要把通过 Visual Studio Community 工具生成出来的应用进行商用,那么就得好好阅读一下微软的许可证和说明书了。
而使用 GCC 与 Clang 编译器构建出来的应用一般没有任何限制,程序员可以将应用程序随意发布和进行商用。
MSVC 编译器对 C99 标准的支持就十分有限,加之它压根不支持任何 C11 标准,所以本教程中设计 C11 的代码例子不会针对 MSVC 进行描述。所幸的是,Visual Studio Community 2017 加入了对 Clang 编译器的支持,官方称之为——Clang with Microsoft CodeGen,当前版本基于的是 Clang 3.8。
也就是说,应用于 Visual Studio 集成开发环境中的 Clang 编译器前端可支持 Clang 编译器的所有语法特性,而后端生成的代码则与 MSVC 效果一样,包括像 long 整数类型在 64 位编译模式下长度仍然为 4 个字节,所以各位使用的时候也需要注意。
为了方便描述,本教程后面涉及 Visual Studio 集成开发环境下的 Clang 编译器简称为 VS-Clang 编译器。
嵌入式系统
而在嵌入式系统方面,可用的C语言编译器就非常丰富了,比如:
用于 Keil 公司 51 系列单片机的 Keil C51 编译器;
当前大红大紫的 Arino 板搭载的开发套件,可用针对 AVR 微控制器的 AVRGCC 编译器;
ARM 自己出的 ADS(ARM Development Suite)、RVDS(RealView Development Suite)和当前最新的 DS-5 Studio;
DSP 设计商 TI(Texas Instruments)的 CCS(Code Composer Studio);
DSP 设计商 ADI(Analog Devices,Inc.)的 Visual DSP++ 编译器,等等。
- 通常,用于嵌入式系统开发的编译工具链都没有免费版本,而且一般需要通过国内代理进行购买。所以,这对于个人开发者或者嵌入式系统爱好者而言是一道不低的门槛。
- 不过 Arino 的开发套件是可免费下载使用的,并且用它做开发板连接调试也十分简单。Arino 所采用的C编译器是基于 GCC 的。
- 还有像树莓派(Raspberry Pi)这种迷你电脑可以直接使用 GCC 和 Clang 编译器。此外,还有像 nVidia 公司推出的 Jetson TK 系列开发板也可直接使用 GCC 和 Clang 编译器。树莓派与 Jetson TK 都默认安装了 Linux 操作系统。
- 在嵌入式领域,一般比较低端的单片机,比如 8 位的 MCU 所对应的C编译器可能只支持 C90 标准,有些甚至连 C90 标准的很多特性都不支持。因为它们一方面内存小,ROM 的容量也小;另一方面,本身处理器机能就十分有限,有些甚至无法支持函数指针,因为处理器本身不包含通过寄存器做间接过程调用的指令。
- 而像 32 位处理器或 DSP,一般都至少能支持 C99 标准,它们本身的性能也十分强大。而像 ARM 出的 RVDS 编译器甚至可用 GNU 语法扩展。
- 下图展示了上述C语言编译器的分类。
‘拾’ 我用clang编译一个文件 main.c 当中引用了当前目录下的 set.h 头文件 编译的时候报
能把当时的命令,目录,代码情况提供一下吗?
我在ubuntu虚拟机中可以正常运行,我猜测可能是这个问题:
1.
#include"set.h"
写成了
#include<set.h>
2.main.c和set.h不在同一目录下
3.命令行中由于隔了几级目录,实际编译的不是你所要的main.c文件,而是其他目录下的main.c文件