㈠ 如何使用Ninja快速編譯LLVM和Clang
1,Build llvm/clang/lldb/lld 3.5.0等組件
1.0 准備:
至少需要從llvm.org下載llvm, cfe, lldb, compiler-rt,lld等3.5.0版本的代碼。
$tar xf llvm-3.5.0.src.tar.gz
$cd llvm-3.5.0.src
$mkdir -p tools/clang
$mkdir -p tools/clang/tools/extra
$mkdir -p tools/lld
$mkdir -p projects/compiler-rt
$tar xf cfe-3.5.0.src.tar.xz -C tools/clang --strip-components=1
$tar xf compiler-rt-3.5.0.src.tar.xz -C projects/compiler-rt --strip-components=1
$tar xf lldb-3.5.0.src.tar.xz -C tools/clang/tools/extra --strip-components=1
$tar xf lld-3.5.0.src.tar.xz -C tools/lld --strip-components=1
1.1 【可選】使用clang --stdlib=libc++時,自動添加-lc++abi。
libc++組件可以使用gcc libstdc++的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.cpp 2012-03-26 18:49:06.663029075 +0800
+++ llvm-3.0.srcn/tools/clang/lib/Driver/ToolChain.cpp 2012-03-26 19:36:04.260071355 +0800
@@ -251,6 +251,7 @@
switch (Type) {
case ToolChain::CST_Libcxx:
CmdArgs.push_back("-lc++");
+ CmdArgs.push_back("-lc++abi");
break;
case ToolChain::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.cpp 2014-09-10 13:46:02.581543888 +0800
+++ llvm-static-3.5.0/tools/clang/lib/Driver/Tools.cpp 2014-09-10 16: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");
+ }
}
static void addProfileRT(
@@ -7150,24 +7156,50 @@
bool isandroid = Triple.getEnvironment() == llvm::Triple::Android;
bool StaticLibgcc = 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");
else if (!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");
// According to Android ABI, we have to link with libdl if we are
// linking with non-static libgcc.
--- llvm-static-3.5.0.bak/tools/clang/include/clang/Driver/Options.td 2014-08-07 12:51:51.000000000 +0800
+++ llvm-static-3.5.0/tools/clang/include/clang/Driver/Options.td 2014-09-10 13:36:34.598511176 +0800
@@ -788,6 +788,7 @@
def fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group<f_Group>;
def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
def fopenmp_EQ : Joined<["-"], "fopenmp=">, Group<f_Group>, Flags<[CC1Option]>;
+def fnolibgcc : Flag<["-"], "fnolibgcc">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group<f_Group>;
def foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group<f_Group>;
def force__cpusubtype__ALL : Flag<["-"], "force_cpusubtype_ALL">;
1.3 llvm的其他補丁。
llvm/clang將gcc toolchain的路徑hard code在代碼中,請查閱tools/clang/lib/Driver/ToolChains.cpp。
找到x86_64-redhat-linux之類的字元串。
如果沒有你系統特有的gcc tripple string,請自行添加。
這個tripple string主要是給llvm/clang搜索gcc頭文件等使用的,不影響本文要構建的toolchain
1.4 構建clang/llvm/lldb
本文使用ninja。順便說一下,llvm支持configure和cmake兩種構建方式。可能是因為工程太大,這兩種構建方式的工程文件都有各種缺陷(主要表現在開關選項上,比如configure有,但是cmake卻沒有等)。llvm-3.4.1就是因為cmake工程文件的錯誤而導致了3.4.2版本的發布。
綜合而言,cmake+ninja的方式是目前最快的構建方式之一,可以將構建時間縮短一半以上。
mkdir build
cd build
cmake \
-G Ninja \
-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" ..
ninja
ninja install
如果系統原來就有clang/clang++的可用版本,可以添加:
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
這樣就會使用系統的clang++來構建llvm/clang
2,測試clang/clang++。
自己找幾個簡單的c/cpp/objc等編譯測試一下即可。完整測試可以在構建時作ninja check-all
3,libunwind/libc++/libc++abi,一套不依賴libgcc, libstdc++的c++運行庫。
3.1 從https://github.com/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 -p build
cd build
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS="-m64" ..
ninja
mkdir -p /usr/lib
cp src/libunwind.so /usr/lib
cp src/libunwind.a /usr/lib
3.2 第一次構建libcxx.
必須先構建一次libcxx,以便後面構建libcxxabi。這里構建的libcxx實際上是使用gcc的libgcc/stdc++/supc++的。
打上這個補丁來禁止libgcc的引入:
diff -Nur libcxx/cmake/config-ix.cmake libcxxn/cmake/config-ix.cmake
--- libcxx/cmake/config-ix.cmake 2014-06-25 06:57:50.000000000 +0800
+++ libcxxn/cmake/config-ix.cmake 2014-06-25 09:05:24.980350544 +0800
@@ -28,5 +28,4 @@
check_library_exists(c printf "" LIBCXX_HAS_C_LIB)
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
-check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
編譯安裝:
mkdir build
cd build
cmake \
-G Ninja \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
..
ninja
ninja install
3.3,測試第一次構建的libcxx。
使用"clang++ -stdlib=libc++ -o test test.cpp -lstdc++"編譯簡單c++代碼,檢查是否出錯。(如果前面構建clang是已經apply了c++abi的鏈接補丁,這里會出現找不到c++abi的情況,跳過即可)
使用"ldd test"查看test二進制動態庫使用情況。可以發現,test依賴於libgcc_s/libc++/libstdc++。(多少有些不爽了吧?使用了libc++居然還要依賴libstdc++?)
㈡ tekkaman ninja移植的u boot用哪種交叉編譯連編譯
手冢治蟲的全部,寺澤武一的全部,浦澤直樹的全部,池上遼一的全部,古谷實的全部,柏木晴子全部以及藤田何日郎全部等等等...
看過的太多了,還是按照作者大略的說方便些,我個人認為以上幾位的作品應該按照年代從頭看一遍,不過工程有點浩大...(其他大家也很多,以上是我現在想到的)...
下面舉幾個我最近一直在看的以及覺得好看沒忘記的:(一些大熱的少年漫大家都肯定看過的就不列舉了)
史上最不幸的大佬三郎
快樂人生
敏行快跑
上班族金太郎
超智游戲
賭博墮天錄
超無氣力戰隊
世界之孫
再見明日
烙印戰士
歷史之眼
浪客行
無限之住人
斗雞
殺戮都市
殺手阿一
第一神拳
明日的丈
愛與誠
我要沖線
光速蒙面俠
浦安鐵筋家族
刃牙系列
帶子雄狼
神之左手,惡魔之右手
幕張
春宵苦短,前進吧,少女~
魁!庫洛瑪蒂高校~
arms 神臂
七人之少年犯
小職員周記
異能者
虹玉
銃夢
五星物語
神鬼帝國
彼岸島
飛向月球
............
不行,越寫越多,根本說不完,我覺得很多其他的也很好看,我這里列舉都是現在能在網上下的到,不是太冷門的東西,希望能幫到你~!^_^
㈢ cenos7中怎麼源碼安裝ninja
建立編譯輸出目錄
mkdir gcc-build-4.9.2
進入輸出目錄,執行命令,並生成makefile文件
編譯
make -j 8
安裝
make install
版本檢查
gcc --version 或 g++ -version
㈣ 安卓7.1怎麼關閉ninja編譯
這個感嘆號是wifi沒用的意思,你只要連上個有用的wifi就行了,或者你刷個沒有wifi提示的第三方rom,不過刷機有危險
㈤ android源碼編譯錯誤,求指點: out/target/proct/generic/obj/lib/libcamera.so', needed by
在生成libcamera.so庫文件的Android.mk中即~/device/sumsumg/libcamera中,去掉其中的ifneq和ifeq條件即可編譯生成libcamera.so
㈥ 在編譯項目的時候出現這樣的錯誤
純虛函數在派生類中如果沒有實現,仍是純虛函數,如果包含類中有純虛函數,那麼類自動成為抽象類,無法實例化,你看看Circle類有沒有實現所有的純虛函數。
㈦ 安卓編譯報錯:missing and no known to make it
編譯過程中報錯提示如下:
make:
***
No
rule
to
make
target
`out/target/common/obj/java_LIBRARIES/libprotobuf-Java-2.3.0-nano_intermediates/javalib.jar',
needed
by
`out/target/common/obj/APPS/Launcher3_intermediates/classes-full-debug.jar'.
Stop.
原生的SDK居然報錯,沒辦法只能著手分析了。從字面分析來看是編譯需要的protobuf
jar包沒有build進去導致的,先看看是哪個相關的包。
host-libprotobuf-java-2.3.0-nano.jar這個jar包沒編譯出來,看了下源碼的mk文件,是有相關的編譯配置的,於是想想是不是有編譯依賴包相關的指令,
網上一找,還真有mma,於是mma一敲,嘩啦啦的過了。
網上有很多介紹的文章是在eclips中導入應用進行編譯的,此處就不作分析了。回頭有空研究下這些個編譯指令。。。
㈧ Android編譯問題out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes-full-debug
明顯有類的方法沒寫對,或者語法出錯了,所以模塊編譯沒通過
㈨ 水果忍者游戲軟體怎麼編譯
1 CocosEditor已發布新版本,現在提供6個實戰demo學xí,包括flappy ,popstar ,fruitninja,moonwarroris,fruitattack,testjavascript;
2 運行demo需要配置好CocosEditor,暫不支持其他工具。demo是跨píng台的,可移植運行android,ios,html5網頁等,代碼是基於javascript語言,cocos2d-x游戲引擎,CocosEditor手游開發工具完成的。
㈩ 編譯Android源碼時出現這個錯誤,請問怎麼解決,跪謝~~~
可以搜索「:=libv8」 ,在其所在的路徑下更新代碼並編譯,通過後再回到你現在所在的目錄編譯。