llvm架構
bitcode本質上就是llvm ir的位元組流格式,我們可以嘗試生成ir**,看一看廬山真面目。首先,建立乙個test.c:
呼叫clang指令#include int main(int argc, char **ar**)
-emit-llvm
:
clang test.c -s -emit-llvm -o test.bc
生成的test.bc**如下:
framework支援bitcode就是在編譯好的目標檔案中增加乙個; moduleid = 'test.c'
source_filename = "test.c"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-s128"
@.str = private unnamed_addr constant [13 x i8] c"hello world\0a\00", align 1
; function attrs: noinline nounwind optnone ssp uwtable
define i32 @main(i32, i8**) #0
declare i32 @printf(i8*, ...) #1
!llvm.module.flags = !
!llvm.ident = !
!0 = !
!1 = !
__llvm
段用來存放編譯生成的中間**ir。應用支援bitcode的前提是專案中所有第三方庫都支援bitcode,否則就只能關閉bitcode選項。
bitcode選項在xcode工程配置中預設是開啟的,如果framework是純oc**,只需要在工程選項other c flags
中增加-fembed-bitcode
即可。如果framework依賴了其他第三方庫,需要所有第三方庫也需要支援bitcode。假如第三方庫使用clang編譯,需要增加編譯選項-fembed-bitcode
。
編譯完成後,通過otool
命令檢視目標檔案是否包含存放bitcode的__llvm
段:
otool -l *** | grep __llvm
如果已經包含bitcode,會有如下結果:
如果想要剝離掉bitcode,通過xcode提供的segname __llvm
segname __llvm
bitcode_strip
命令也可以很方便的做到:
xcrun bitcode_strip input [ -r | -m | -l ] -o output
靜 動態庫的簡單製作
靜態庫 1.a.建立靜態庫專案 b1.配置支援的最低版本 b2.設定適配所有模擬器的架構 b3.建立乙個內容類 b4.新增公開檔案 2.生成4個.a檔案並且合併 分別按照debug環境和release環境,生成真機很模擬器的.a檔案 分別合成debug和release真機與模擬器的.a檔案 a.de...
靜 動態鏈結庫使用總結
編寫方法 visual studio為例 一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num...
動態鏈結庫使用 靜 動態鏈結庫使用總結
一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num1,int num2 int mult i...