iOS 靜態類庫 編譯 C,C++
我們都知道,OC 原生支持C, 在 創建的 OC類的 .m 里面,可以直接編寫C的代碼;
同樣 Xcode 也支持 OC ,C++的混編,此時,我們通常把OC創建的 .m 文件,手動修改為 .mm 文件以支持 oc c++的混編
基於上面的特性,我們在打包靜態類時,可以編譯C,OC,C++ 以及三者混合的代碼;
因為大多數誇平台的算法庫代碼都是C或是C++寫的,我們利用Xcode編譯成靜態類庫,可以非常安全的提供給別人使用
如下示例:
一:靜態庫打包 C 代碼
1. Xcode 創建一個 靜態類庫項目,就是Cocoa Touch Static Library;
2. 創建好項目之后,File new,C file, 創建一個 A.c 文件;
在 A.c 里面,寫一個測試代碼,假如 hello() 方法,是咱們的核心代碼,不想讓別人知道,只想給外界提供一個 方法名;hello()
void hello(void) { printf("hello world!"); }
這時,我們可以再接着 創建一個 Header File ,命名為 A.h, 在該文件里面,寫上
void hello(void);
上面 .c 文件的 方法名,即可;然后在 靜態類庫的選項里面,,把 .c 添加到 編譯里面,把 .h 添加到 輸出里面;
這樣,別人在拿到打包的 .a 之后,再配置頭文件,,即可使用 hello() 方法;而不用 擔心會暴露 hello()的內部實現;
注意:在使用該靜態庫的時候,不要用 .mm , 用 .m ;因為此編譯的是C方法,OC 原生支持C;
二:靜態類庫打包 C++ 代碼
1. Xcode 創建一個 靜態類庫項目,就是Cocoa Touch Static Library;
2. New File 創建一個 C++ Class, 此時項目里面,會生成名為 A.cpp 和 A.h ;
可以看到 以后 C++ 代碼,方法的聲明 放到 A.h 里面,,方法的實現 放到 A.cpp 里面,實現即可;
在給別人打包提供時,同樣把 cpp 放到編譯里面,把.h 放到 輸出里面,即可;
如 我們在 A.h 里面同樣放上 一個 c的 測試 hello(); 方法聲明
void hello(void);
在 A.cpp 里面,寫上方法的實現
void hello(void) { printf("hello world"); }
打包編譯,在使用的時候,我們就要用 .mm 了,而不能用 .m了,,
雖然這兩種方式寫的同樣的是 C的方法,但是意義不一樣了;上面編譯的是純C,而下面的,雖然寫的是c代碼,但是編譯的是C++;
所以在調用此包時,要用 OC,C++混紡,即 .mm 文件;
三:總結注意
1. 如果編譯純C,.c文件, 用 .m 即是 OC,C混編;
2. 如果編譯C++,.cpp文件,用 .mm 即是 OC C++混編;
3. .cpp的文件里面,可以調用寫的 .c 文件,用 .mm 即 OC,C,C++混編;