导航:首页 > 源码编译 > clang编译

clang编译

发布时间:2022-02-02 09:42:13

㈠ 如何设置来用clang/clang++替换linux下的默认编译器Gcc

是两种不同的C++编译器。gcc历史很悠久了,而clang是新兴的编译器,已经兼容gcc,也全面支持C++11标准、Objective-C等,当然二者都是cross-platform的。具体的区别可以移步维基网络中gcc和clang词条。

㈡ 哪个 语言 编译 体积 最小 clang

主要还是看算法
在相同算法情况下
汇编做出来的程序 体积最小
高级语言中C最小
其次C++

㈢ 编译llvm和clang需要多大空间

:转自知乎 蓝色 我最近和Clang/LLVM打交道比较多,目前游离在LLVM IR和IBM WCode之间。对于学习Clang/LLVM来说,其实需要看你做什么,是研究C, C++, Objective-C在Clang的实现,抑或着是想利用Clang做AST层面的事情,还是说想要利用LLVM IR来做

㈣ Clang 比 GCC 编译器好在哪里

编译速度更快、编译产出更小、出错提示更友好。尤其是在比较极端的情况下。

两年多前曾经写过一个Scheme解释器,词法分析和语法解析部分大约2000行,用的是Boost.Spirit——一个重度依赖C++模版元编程的框架。当时用g++ 4.2编译的情况是:

编译速度极慢:完整编译一次需要20分钟

编译过程中内存消耗极大:单个g++实例内存峰值消耗超过1G
中间产出物极大:编译出的所有.o文件加在一起大约1~2G,debug链接产物超过200M
编译错误极其难以理解:编译错误经常长达几十K,基本不可读,最要命的是编译错误经常会长到被g++截断,看不到真正出错的位置,基本上只能靠裸看代码来调试
这里先不论我使用Spirit的方式是不是有问题,或者Spirit框架自身的问题。我当时因为实在忍受不了g++,转而尝试clang。当时用的是clang 2.8,刚刚可以完整编译Boost,效果让我很满意:
编译速度有显着提升,记得大约是g++的1/3或1/4
编译过程中的内存消耗差别好像不大
中间产出物及最终链接产物,记得也是g++的1/3或1/4
相较于g++,编译错误可读性有所飞跃,至少不会出现编译错误过长被截断的问题了
当时最大的缺点是clang编译出的可执行文件无法用gdb调试,需要用调试器的时候还得用g++再编译一遍。不过这个问题后来解决了,我不知道是clang支持了gdb还是gdb支持了clang。至少我当前在Ubuntu下用clang 3.0编译出的二进制文件已经可以顺利用gdb调试了。

最后一点,其他同学也有讲到,就是Clang采用的是BSD协议。这是苹果资助LLVM、FreeBSD淘汰GCC换用Clang的一个重要原因。
答案出自:http://www.hu.com/question/20235742

㈤ Clang 比 GCC 好在哪里

编译速度更快、编译产出更小、出错提示更友好。尤其是在比较极端的情况下。 两年多前曾经写过一个Scheme解释器,词法分析和语法解析部分大约2000行,用的是Boost.Spirit——一个重度依赖C++模版元编程的框架。当时用g++ 4.2编译的情况是: 编译速度极慢:完整编译一次需要20分钟 编译过程中内存消耗极大:单个g++实例内存峰值消耗超过1G 中间产出物极大:编译出的所有.o文件加在一起大约1~2G,debug链接产物超过200M 编译错误极其难以理解:编译错误经常长达几十K,基本不可读,最要命的是编译错误经常会长到被g++截断,看不到真正出错的位置,基本上只能靠裸看代码来调试 这里先不论我使用Spirit的方式是不是有问题,或者Spirit框架自身的问题。我当时因为实在忍受不了g++,转而尝试clang。当时用的是clang 2.8,刚刚可以完整编译Boost,效果让我很满意: 编译速度有显着提升,记得大约是g++的1/3或1/4 编译过程中的内存消耗差别好像不大 中间产出物及最终链接产物,记得也是g++的1/3或1/4 相较于g++,编译错误可读性有所飞跃,至少不会出现编译错误过长被截断的问题了 当时最大的缺点是clang编译出的可执行文件无法用gdb调试,需要用调试器的时候还得用g++再编译一遍。不过这个问题后来解决了,我不知道是clang支持了gdb还是gdb支持了clang。至少我当前在Ubuntu下用clang 3.0编译出的二进制文件已经可以顺利用gdb调试了。 最后一点,其他同学也有讲到,就是Clang采用的是BSD协议。这是苹果资助LLVM、FreeBSD淘汰GCC换用Clang的一个重要原因。

㈥ 我用clang编译一个文件 main.c 当中引用了当前目录下的 set.h 头文件 编译的时候报

能把当时的命令,目录,代码情况提供一下吗?

我在ubuntu虚拟机中可以正常运行,我猜测可能是这个问题:

1.

#include"set.h"

写成了

#include<set.h>

2.main.c和set.h不在同一目录下

3.命令行中由于隔了几级目录,实际编译的不是你所要的main.c文件,而是其他目录下的main.c文件

㈦ clion中如何将默认编译器设为clang

不建议在 CMakeLists.txt 里面直接设置 CMAKE_CXX_COMPILER,毕竟文件里那部分是通用的。
可以在调用 cmake 的时候加上参数,如

cmake -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++

㈧ Clang到底怎么用

它默认采用了静态编译,构建的 : Windows 下面 mingw 的部分标准库和微软 vs 或者说 MSVC 使用的都是 msvcrt。 mingw 有多个版本例如 tdm-gcc具体来说一下,一般来说,一个包含了 的 Helloworld 可执行文件.exe 里包含了 mingw 的部分库文件

㈨ GCC/G++,ICC,Clang,MSVC,BCC等C/C++编译器有什么特长和不足

clang编译速度快,但是貌似编译结果运行相对会慢。功能更新一般也比较快。
g++编译速度比clang慢,编译结果运行貌似比clang快。功能更新稍慢。
vc这几年没编译过大工程,感觉上编译速度在clang和g++之间。以过去的经验g++和vc编译结果运行速度差不多。功能更新上就是一坨屎。但是在Windows上写点正经东西你可能不得不用它,相对的你也只能在Windows上用它。
icc很久没用过,过去印象编译速度很慢,运行速度最快但是感觉有点得不偿失。最大的问题是这东西要钱,前三个都是免费的。
bcc直接无视就好了。

㈩ 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++?)

阅读全文

与clang编译相关的资料

热点内容
无盘服务器启动不开怎么办 浏览:89
25芯片编程器 浏览:828
单片机src 浏览:606
打开我的文件夹白色太亮 浏览:29
求导运算法则除法图片 浏览:263
歌曲解压密码通用 浏览:409
安卓手机神武手游怎么双开 浏览:583
加密的门禁复制上开不了门 浏览:509
命令形对话 浏览:394
安卓手机的小音箱怎么连接 浏览:263
陈述指数幂的运算法则 浏览:499
delphi源码32位 浏览:617
新文件夹怎么编写 浏览:860
无线网没有加密怎么加密 浏览:795
文件夹一直弹出怎么办 浏览:692
离心式往复式压缩机出口温度 浏览:857
如何通过华为云服务器 浏览:966
pdf文件怎么转换成jpg 浏览:935
程序员买橘子 浏览:344
学编程买游戏币还是全能本 浏览:335