當前位置:首頁 » 編程軟體 » ios交叉編譯

ios交叉編譯

發布時間: 2022-06-30 12:51:47

① 如何通過cython調用objective-c的類,交叉編譯到IOS上

可以放到項目文件里編譯,就可以防止交叉編譯, 另外include主要需要結構上的管理,也就是通過技術管理的方法進行規避。 如果多人開發團隊任意include, 你通過編譯時的技術手段很難管理好
用pthread實現跨平台。 用cocoa的NSTread或是GCD是無法跨平台的。 你也許會oc的多線程,但在跨平台開發的時候果斷摒棄掉吧。
在我開始使用OpenAphid-Engine的時候,已經有幾種類似的iOS/Android 項目.這些商業項目或者開源項目使用javaScript實現代碼特性。比如,Titanium 和PhoneGap 允許開發者使用JavaScript開發本地 iOS/Android apps;ngCore 更是可以使用純正的JavaScript構建跨平台的游戲。JavaScript已經成為了編程語言中的佼佼者,也因為更容易學習吸引了眾多開發者參與到這一領域。

怎樣在IOS/Android上使用JavaScript

主要有兩種方法。一種是使用系統的瀏覽器組件(IOS中的UIWebView和Android中的WebView),另一方法就是使用整合好的JavaScript引擎。
使用系統的瀏覽器組件比較容易實現但是更復雜,效率也低。 WebView提供了 addJavascriptInterface 把Java classes注入到JavaScript文本的方法。但是它只支持最原始的幾種數據類型,因此也局限了API設計。並且在Android 2.3模擬器上不穩定,在真機上也會遇到 issue #12987的問題。在IOS上更糟 UIWebView沒有公共的APIs支持JavaScript到Objective-C的交互(你必須使用似有的APIs才能達到與addJavascriptInterface相同的功能)。

② uap mobile使用交叉編譯技術,與appcan apicloud相比,效率如何

當前移動平台開發方面的主流技術大體分三種:Web技術(Javascript、css3、HTML5)、Native技術(Java、C/C++、C#原生)及Hybird混合技術(HTML+Native混合)。據張建新介紹,目前,採用HTML和Hybird混合開發技術的App更多些,比如Bai Clouda、IBM Worklight、Intel App mobi、Oracle ADF mobile等,而原生的如Titanium、SUP Android/iOS等相對較少。相比較而言,HTML的優勢在於實現簡單,而Native在性能和表現力上更好,Hybird混合技術則可以整合HTML5 Web應用與本地容器(native container),前者具有可移植性,而後者可以協助訪問本地設備功能。

③ iOS面試題有哪些

iOS面試題主要有:
1、多線程、特別是NSOperation 和 GCD 的內部原理。
2、運行時機制的原理和運用場景。
3、SDWebImage的原理。實現機制。如何解決TableView卡的問題。
4、block和代理的通知的區別。block的用法需要注意些什麼。
5、strong,weak,retain,assign, nomatic 等的區別。
6、設計模式,mvc,單利,工廠,代理等的應用場景。
7、單利的寫法。在單利中創建數組應該注意些什麼。
8、NSString 的時候用和strong的區別。
9、響應值鏈。
10、NSTimer 在子線程中應該手動創建NSRunLoop ,否則不能循環執行。
11、UIScrollView和NSTimer組合做循環廣告圖輪播的時候有一個屬性可以控制當上下滾動tableview的時候廣告輪播圖依然正常滾動。
12、Xcode最新的自動布局。
13、git ,和svn的用法,git的幾個命令。
14、友盟報錯可以查到具體某一行的錯誤,原理是什麼。
15、Instrument 可以檢測 電池的耗電量、和內存的消耗。的用法。
16、動畫CABaseAnimation CAKeyAni…. CATrans….. CAGoup…. 。
17、ARC的原理。

④ 如何實現protobuf在XCODE上armv7/armv7s/i386的交叉編譯

步驟一:部署protoc.exe

1)sudo su ---進入管理模式

//以下操作切換至protobuf文件夾

2)./configure

3)make

4)make check

5)make install

此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯庫的運行環境

我本地的-build=x86_64-apple-darwin12.3.0

-host=x86_64-apple-darwin12.3.0

(這兩個參數在後續配置腳本需要用到,與後面腳步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0後綴「arm-apple-darwin12.3.0」保持一致)

6)make distclean清理已生成的makefile,為交叉編譯配置新makefile做准備

步驟二:配置交叉編譯

1)執行腳本ios-build.sh,腳本內容如下:

configure_for_platform() {

export PLATFORM=$1

#export PLATFORM=iPhoneOS

echo "Platform is ${PLATFORM}"

if [ "$PLATFORM" == "iPhoneSimulator" ]; then

export ARCHITECTURE=i386

export ARCH=i686-apple-darwin12.3.0

fi

if [ "$PLATFORM" == "iPhoneOS" ]; then

export ARCHITECTURE=$2

export ARCH=arm-apple-darwin12.3.0

fi

export ARCH_PREFIX=$ARCH-

export SDKVER="6.1"
#sdk版本號必須正確

export
DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer

export SDKROOT="$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk"

export
PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig"

export AS="$DEVROOT/usr/bin/as"

export ASCPP="$DEVROOT/usr/bin/as"

export AR="$DEVROOT/usr/bin/ar"

export RANLIB="$DEVROOT/usr/bin/ranlib"

#export CPP="$DEVROOT/usr/bin/c++"

#export CXXCPP="$DEVROOT/usr/bin/c++"

export CC="$DEVROOT/usr/bin/gcc"

export CXX="$DEVROOT/usr/bin/g++"

export LD="$DEVROOT/usr/bin/ld"

export STRIP="$DEVROOT/usr/bin/strip"

export LIBRARY_PATH="$SDKROOT/usr/lib"

export CPPFLAGS=""

⑤ 有沒有講mac上交叉編譯ios庫的相關書籍

1、首先在 MacBook Air 關上的情況下,按著 Command 及 R 兩個按鍵不放手,然後同時按下最右上角的開關鍵一下(記著此時仍然繼續按著 Command + R 鍵)。
2、當進入至此介面後,就可以放開所有按鍵。當中有 4 個選項:Restore From Time Machine Backup 是從你過去備份至 Time Machine 的映像檔回復電腦、Reinstall Mac OS X 顧名思義就是重新安裝 Mac OS X Lion、Get Help Online 則是從線上擷取幫助檔了解重裝步驟及常見問題、而最後的 Disk Utility 則是管理硬碟之用,包括:分割磁區、將磁碟區格式化等。
3、在畫面右上角,可以連接 Wi-Fi,建議大家必須連接,以確保下載及安裝過程一切順利。
4、點按「Get Help Online」就可以看到回復系統的所有資料及步驟。
5、最有趣的是,它其實是一個完整版的 Safari,在此已可以上網瀏覽網頁。
6、如果點按 Restore From Time Machine Backup,就可以進入此介面。記著此時要將過去用作 Time Machine 備份的外置硬碟與 MacBook Air 接駁,再點按「Continue」。
7、如果已接駁了硬碟,應可在此頁看到過去的備份檔,只要選取了再點按「Continue」就可以將 MacBook Air 回復至備份時的情況。由於未有使用 Time Machine,所以不在此再多述此項功能了。
8、點按「Partitions」,再拉動下方左側白色部分右下角的位置,就可以調節使用 Macintosh HD 的部分。完成後再在右方點按未設定的部分,再建立新磁區就可以了。當然,安裝了 Mac OS X Lion 後,大家亦隨時可以在「Utilities」中的「Disk Utility」進行這項動作。
9、點按「Reinstall Mac OS X」,然後會彈出在安裝前會先與 Apple 的伺服器取得認證,記得此時一定要接駁互聯網,然後點按「Continue」繼續。
10、點按「Reinstall Mac OS X」,然後會彈出在安裝前會先與 Apple 的伺服器取得認證,記得此時一定要接駁互聯網,然後點按「Continue」繼續。
11、會看到一段 Agreement,點按「Agree」後再點按上方的「Agree」即可。
12、再選擇希望將 Mac OS X Lion 安裝到哪個磁碟區。
13、開始重裝了,等等吧!這個下載步驟大約需要 1 小時左右(在 Wi-Fi 連線情況下)。

⑥ ios之javascriptcode怎麼用

在我開始使用OpenAphid-Engine的時候,已經有幾種類似的iOS/Android 項目.這些商業項目或者開源項目使用JavaScript實現代碼特性。比如,Titanium 和PhoneGap 允許開發者使用JavaScript開發本地 iOS/Android apps;ngCore 更是可以使用純正的JavaScript構建跨平台的游戲。JavaScript已經成為了編程語言中的佼佼者,也因為更容易學習吸引了眾多開發者參與到這一領域。 怎樣在IOS/Android上使用JavaScript 主要有兩種方法。一種是使用系統的瀏覽器組件(IOS中的UIWebView和Android中的WebView),另一方法就是使用整合好的JavaScript引擎。 使用系統的瀏覽器組件比較容易實現但是更復雜,效率也低。 WebView提供了 addJavascriptInterface 把Java classes注入到JavaScript文本的方法。但是它只支持最原始的幾種數據類型,因此也局限了API設計。並且在Android 2.3模擬器上不穩定,在真機上也會遇到 issue #12987的問題。在IOS上更糟 UIWebView沒有公共的APIs支持JavaScript到Objective-C的交互(你必須使用似有的APIs才能達到與addJavascriptInterface相同的功能)。 PhoneGap 是基於 UIWebView and WebView的比較出名的項目。開發者被迫使用回調函數從JavaScript APIs得到返回值。這在游戲上效率極低,也更為復雜。 早期的ngCore同樣依賴UIWebView來支持iOS。但是這個機制由於其糟糕的表現被取代。 為了獲得更好的表現、靈活性、兼容性,嵌入全功能的JavaScript引擎變得更為有效。 選擇JavaScript 引擎 據我所知,iOS 或 android 上能夠運行的JavaScript 引擎有4個: JavaScriptCore, SpiderMonkey, V8 and Rhino.下面這個表格展示各個引擎在iOS 和 Android 的兼容性 當我設計 OpenAphid-Engine 成為一個合適的Javascript的引擎的時候,我主要考量以下指標: 兼容性:同時支持iOS 和 Android 在x86 和 ARM 平台上的 模擬器和 設備。 穩定性. 穩定的運行在對應的平台和CPU的架構上。 擴展性. 能夠很方便的利用本地特性進行擴展。例如OpenAphid-Engine 通過一個橋接層,實現了通過Javascript 進行OpenGL ES 的使用。 性能好:一個快速的Javascript 引擎主要歸結為兩個因素:有效的綁定機制和進行較低的開銷。. OpenAphid-Engine 在渲染一幀頁面的時候通過JavaScript觸發數百個OpenGL ES調用來進行渲染。這點是非常有意義的,如果只是把開銷放到單純的執行JavaScript上進行將會導致渲染很慢,。 體積小.:在內存的佔用上和自身的執行文件上都要比較小。 Rhino和 V8出現的最早,但是不支持iOS。我非常希望可以使用 V8開發 OpenAphid-Engine ,在初次使用時就發現它擁有優雅的代碼結構,良好的表現,但是我非常失望,因為 V8隻能在JIT模式下使用,而IOS不支持。除非你使用jailbroken設備。(詳情請參考 issue #1312) 我在JavaScriptCore和SpiderMonkey間糾結了很久。在成功部署了Android和IOS項目後,我通過實驗找到更好的一個。 SpiderMonkey 容易得到開發許可權,但是在與JavaScriptCore比較時甘拜下風。SpiderMonkey產生了大量的二進制文件 (在ARMv7上大約1.3MB);JavaScript執行得更慢,在JavaScript和C++的橋接表現更為重要。另外一個讓我遠離SpiderMonkey的原因是在iOS模擬器上出現隨機崩潰現象。 JavaScript引擎會受很多東西影響,比如交叉編譯器的版本、引擎的版本和操作系統的種類等。下表列舉了幾種運行在iPod Touch 4上引擎的運行時間。(有興趣請於Google Doc查看精確的時間) JavaScriptCore 大比分領先。 我沒有找到SpiderMonkey,所以就使用了下面的三種自定義搭建Cocos2d-iPhone-2.1-beta4, Cocos2d-x-2.1-beta3和iMonkey。 所有測試的apps都基於LLVM 4.1版本,所有的引擎都運行在解釋器模式(iOS受限)。 幾種基準的介紹: 1m-js_loop執行空循環一百萬次。 1m-native_function請求調用一百萬次返回undefined的本地函數 1m-js_function跟上面一個相同,只是換成了JavaScript。 fib(30)遞歸的方式計算Fibonacci(30)。 sudoku-5用這里的演算法解決Sudoku問題。 1m-native_function JavaScriptCore使用可移植的C APIs實現,當然這不是最有效引入本地函數的方法。 SpiderMonkey 在台式電腦上由於高級的JIT追蹤方法運行更快,但是在IOS設備上卻與之相反。 在大部分的基準上,使用iMonkey比SpiderMonkey更快 很明顯的,使用SpiderMonkey將會在iOS上獲得更好的表現。ngCore 1.10在iOS上加入自定義功能,所以要更優於像SpiderMonkey這樣的變體。 對於JavaScript Code 的挑戰 在我專心於 JavaScriptCore之後,我的研究更進了一步: 1. 它在運行 一百萬 次 native_function和 一百萬次Math.abs(0) 的時間六倍於 使用 JavaScriptCore.我觀察到同樣的性能問題出現在通過注入的方式訪問對象的屬性。 2. 利用 C APIs 進行設計雖然開發簡單,但是缺乏靈活的內存管理機制。缺乏一個高級的內部垃圾回收機制很難解決類似於 circular references 的問題。 3. 眾多的 JavaScriptCore 正式版本都是可用的 。 不過 OpenAphid-Engine 是更好的一個,它不但速度快,而且相當小。 我拋棄了原來的使用 C APIs 方案因此解決了 問題 1 和 2. 使用的JSC 版本來自於iOS4.3.3,因為同樣在解析器模式下這個版本相比來自於iOS 5 的版本更快,執行文件更小。 在其他產品上使用的JS引擎 在開發OpenAphid-Engine期間,我一直保持對其他引擎的關注,以下這個表格總結了其他JS引擎的使用情況

⑦ ios開發高手進!!objective-c的#import 會將頭文件的內容全部包含到.m文件中嗎它是怎麼防止交叉編譯的

可以放到項目文件里編譯,就可以防止交叉編譯,
另外include主要需要結構上的管理,也就是通過技術管理的方法進行規避。

如果多人開發團隊任意include, 你通過編譯時的技術手段很難管理好

⑧ ios import <> 和 的區別

#import比起#include的好處就是不會引起交叉編譯
在 Objective-C中,#import 被當成 #include 指令的改良版本來使用。除此之外,#import 確定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題
@class一般用於頭文件中需要聲明該類的某個實例變數的時候用到,在m文件中還是需要使用#import
@class就是告訴編譯器有這么一個類,至於類的定義是啥不知道
@class一般用於頭文件中需要聲明該類的某個實例變數的時候用到,在m文件中還是需要使用#import
#import<> 跟 #import""又什麼區別?
「」的意思是自己創建的文件,用這個首先會在當前的目錄中尋找,如果找不到就到其他的位置尋找,「」和<>是相對的一個是自己創建的文件一個是系統的文件

⑨ 如何使用clang+llvm+binutils+newlib+gdb搭建交叉編譯環境

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

熱點內容
c服務編譯耗時優化原理及實例 發布:2024-05-03 15:35:26 瀏覽:15
ue編程 發布:2024-05-03 15:34:40 瀏覽:610
經典的c語言程序 發布:2024-05-03 15:03:24 瀏覽:859
工程加密網 發布:2024-05-03 14:59:55 瀏覽:292
吃冰球解壓 發布:2024-05-03 14:59:10 瀏覽:895
編譯晶元發燙 發布:2024-05-03 14:59:05 瀏覽:549
優化演算法pdf 發布:2024-05-03 14:18:10 瀏覽:291
python演算法書 發布:2024-05-03 14:14:25 瀏覽:736
方舟怎麼加入伺服器閃退 發布:2024-05-03 14:05:27 瀏覽:491
安卓心跳怎麼打出來 發布:2024-05-03 13:59:23 瀏覽:100