導航:首頁 > 源碼編譯 > 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編譯相關的資料

熱點內容
怎麼壓歲文件夾 瀏覽:889
幫人解壓的說說 瀏覽:740
登記本解壓預約流程 瀏覽:508
springboot載入配置文件源碼 瀏覽:124
程序員旅行箱 瀏覽:235
程序員月薪8萬個稅 瀏覽:510
汽車App深度檢測是什麼 瀏覽:190
python支持的平台 瀏覽:288
串口命令列印 瀏覽:704
神盾加密磁碟評價 瀏覽:92
伺服器瀏覽記錄能看到什麼 瀏覽:116
她說程序員不懂浪漫 瀏覽:1004
反甲被動演算法 瀏覽:102
破解NFC二級加密 瀏覽:301
CAD參照編輯的命令 瀏覽:891
python文本挖掘分類 瀏覽:494
硬碟加密位置不可用 瀏覽:544
北宋時期數據加密的方法 瀏覽:277
linux命令行bash 瀏覽:871
php攻擊馬 瀏覽:524