https://blog.csdn.net/snaill/article/details/4092748
https://blog.csdn.net/lizhongfu2013/article/details/42387311html
Clang是一個C++編寫、基於LLVM、發佈於LLVM BSD許可證下的C/C++/Objective-C/Objective-C++編譯器。它與GNU C語言規範幾乎徹底兼容(固然,也有部分不兼容的內容,包括編譯命令選項也會有點差別),並在此基礎上增長了額外的語法特性,好比C函數重載(經過__attribute__((overloadable))來修飾函數),其目標(之一)就是超越GCC。
參考:https://www.oschina.net/p/clangios
LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、連接時間(link-time)、運行時間(run-time)以及空閒時間(idle-time),對開發者保持開放,併兼容已有腳本。
LLVM計劃啓動於2000年,最初由美國UIUC大學的Chris Lattner博士主持開展。2006年Chris Lattner加盟Apple Inc.並致力於LLVM在Apple開發體系中的應用。Apple也是LLVM計劃的主要資助者。
目前LLVM已經被蘋果IOS開發工具、Xilinx Vivado、Facebook、Google等各大公司採用。
LLVM官方參考:https://llvm.org/web
Xcode 是運行在操做系統Mac OS X上的集成開發工具(IDE),由Apple Inc開發。Xcode是開發 macOS 和 iOS 應用程序的最快捷的方式。Xcode 具備統一的用戶界面設計,編碼、測試、調試都在一個簡單的窗口內完成。macos
Objective-C,一般寫做ObjC或OC和較少用的Objective C或Obj-C,是擴充C的面向對象編程語言。它主要使用於Mac OS X和GNUstep這兩個使用OpenStep標準的系統,而在NeXTSTEP和OpenStep中它更是基本語言。
GCC與Clang含Objective-C的編譯器,Objective-C能夠在GCC以及Clang運做的系統上編譯。
1980年代初布萊德·考克斯(Brad Cox)在其公司Stepstone發明Objective-C。他對軟件設計和編程裏的真實可用度問題十分關心。Objective-C最主要的描述是他1986年出版的書 Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.編程
(1)用於單元測試:
File–>new—>Project—>iOS(application)–>選擇single view Application,而後根據提示選擇工程路徑,便可完成工程的建立。
(2)用於庫測試:
File—>new—>Project—>iOS(FrameWork & Library)—>選擇Cocoa Touch Static Libarary,而後根據提示選擇工程路徑,便可完成工程的建立。xcode
(1)在左上角工程文件名稱旁邊選擇設備名稱;
(2)在執行工程以前,單擊工程名稱,須要檢查以下配置:
a. 單擊工程名,在General菜單欄中確認Linked Framework and Libararies下是否須要添加的碼流文件或者庫文件等;Build Phases中確認Complie Sources(需編譯的資源)和Linked Binary with Libaraies(庫文件)等。架構
注意事項:庫文件添加必須經過Build Phases中Linked Binary with Libaraies添加,不能經過將資源拖拽到包(工程)中!app
b. 在Build Setting中確認Architectures:
下面三個選項是與架構平臺相關的選項:
Architectures:
Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.框架
ONLY_ACTIVE_ARCH:在須要編譯全平臺的ios可執行文件時,設置爲no,此時VALID_ARCHS無效;不然單獨編譯某個平臺的ios可執行文件時,設置爲yes。設置爲yes,只編譯當前的Architecture和ONLY_ACTIVE_ARCH交集的版本。該選項用於指定是否只對當前鏈接設備所支持的指令集編譯。在xcode6.1中VALID_ARCH默認指定爲Standard architectures(armv7,arm64),這樣會編譯打包32位和64位的代碼。
當其值設置爲YES,這個屬性設置爲yes,是爲了debug的時候編譯速度更快,它只編譯當前的architecture版本,而設置爲no時,會編譯全部的版本。 編譯出的版本是向下兼容的,鏈接的設備的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。好比你設置此值爲yes,用iphone4編譯出來的是armv7版本的,iphone5也能夠運行,可是armv6的設備就不能運行。 因此,通常debug的時候能夠選擇設置爲yes,release的時候要改成no,以適應不一樣設備。
VALID_ARCHS: ios32: armv7,armv7s ;ios64: arm64
Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If
the resulting architecture list is empty, the target generates no binary.
關於Architectures和VALID_ARCHS的選擇,更多可參考:
https://blog.csdn.net/lizhongfu2013/article/details/42387311
注意事項:ios平臺打包全部平臺靜態庫(lib_universal.a)的方法:
makefile腳本以下:
all: test -d ../bin/tmp || mkdir ../bin/tmp #armv7 make -C ./dec_lib PLATFORM=ios32 cp ../lib/ios32/lib_test.a ../bin/tmp/lib_test_ios32.a #arm64 make -C ./dec_lib PLATFORM=ios64 cp ../lib/ios64/lib_test.a ../bin/tmp/lib_test_ios64.a #i386 make -C ./dec_lib PLATFORM=ios_i386 cp ../lib/ios_i386/lib_test.a ../bin/tmp/lib_test_ios_i386.a #x86_64 make -C ./dec_lib PLATFORM=ios_x86_64 cp ../lib/ios_x86_64/lib_test.a ../bin/tmp/lib_test_ios_x86_64.a libpo -create ../bin/tmp/* -output ../lib/libtest_univesal.a rm -rf ../bin/tmp
(3)添加demo文件(main.c,頭文件)。將demo文件和庫文件拷貝到剛剛創建的xcode工程下面,在工程名上右鍵–>add files to xxx—>選擇須要添加的文件完成文件添加。
(4)工程設置。點擊工程名—>build settings—>code signing–>設置code signing identity中的項目(debug/release)。
(5)添加靜態庫文件。點擊工程名—>build phases—>link binary with libraries—>將須要添加的庫加進來。
(6)添加資源文件。點擊工程名—>build phases---->copy bundle resourses—>將須要的資源文件添加進來。
(7)讀取碼流文件。點擊itools工具—>選擇新建的app名字---->點擊文件夾符號---->documents---->導入----->選中須要導入的測試碼流。須要注意讀取碼流文件時的路徑應該也是手機中documnent目錄。
(8)在app控件初始化函數中添加代碼。在主函數中需添加在ViewController.m的viewDidLoad函數中,做爲一個普通函數調用:
例如:
int main_test(int argc, char *argv[], char *pin, char *pout); //函數聲明 -(void) viewDidLoad{ [super viewDidLoad]; NSArray* array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//當前報的域指向對應手機中的文件指針 NSString* strDocument = [array objectAtIndex:0]; NSString* outfilePath = [strDocument stringByAppendingPathComponent:@"test_out.yuv"];//輸出路徑須要在手機相應的document下! NSLog(@"output path is %@",outfilePath); //用於打印數據 NSString* InputfilePath = [[NSBundle mainBundle] pathForResource:@"svac2"];//輸入文件能夠直接使用包的路徑,這樣,碼流文件放在包(工程)中便可。 NSLog(@"input mainBudle path is %@",InputfilePath); main_test(0,NULL,[InputfilePath UTF8String],[outputtfilePath UTF8String]);//demo文件傳入相應參數 }
說明:將咱們本身的庫demo加入到xcode工程中的方法的進一步說明:
測試描述:新建一個簡單的app工程,將原來咱們本身的庫demo添加到app中測試,能夠將main_test()函數添加到app控件初始化函數下(須要將demo文件中的main函數修改成main_test函數名),這樣控件初始化的時候,就能夠執行main_test()函數。
(9)從手機中獲取xcode工程生成的yuv文件或者log文件:
a. 在launchpad中找到iTools;
b. 在應用中找到進行解碼的xcode工程名稱,好比test_demo,而後選中工程右鍵選擇文檔;而後點擊所須要的文件導出便可。
(10)一個xcode工程既能夠運行arm_ios32彙編,也能夠運行arm_ios64彙編,須要選中TARGETS進行相應修改:
a. 在工程設置Build_settings下Architectures----ONLY_ACTIVE_ARCH設爲Yes;
b. 在工程設置Build_settings下Architectures----VALID_ARCHS中
ios32: armv7
ios64: arm64
mac(xcode6.1環境)+iphone SE
ios 32位測試機:iphone 5c (蘋果A6(Cortex-A7處理器),32位雙核處理器,1G運行內存,架構:armv7s)
ios 64位測試機: iphone 6s (蘋果A9,64位雙核處理器,2G運行內存,架構:arm64)
ios/mac相關編譯器、系統庫和頭文件的選擇及其路徑:
一、編譯器路徑:
不管是對於ios仍是ios simulator都是這個路徑:
/Applications/Xcode6.4.app/Contents/Developer/ToolChains/XcodeDefault.xctoolchain/usr/bin/clang
二、系統庫和頭文件路徑:
在路徑/Applications/Xcode.app/Contents/Developer/Platforms下面
三、查看編譯器或工具的路徑:
xcrun -sdk iphonesimulator -find xcrun -sdk iphoneos -find xcrun -sdk macos -find clang
THE END!