智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

深入理解iPhone靜態庫

來源:網絡

點擊:1207

A+ A-

所屬頻道:新聞中心

關鍵詞: iPhone,靜態庫

      在實際的編程過程中,通常會把一些公用函數制成函數庫,供其它程序使用,一則提搞了代碼的復用;二則提搞了核心技術的保密程度。所以在實際的項目開發中,經常會使用到函數庫,函數庫分為靜態庫和動態庫兩種。和多數人所熟悉的動態語言和靜態語言一樣,這里的所謂靜態和動態是相對編譯期和運行期的:靜態庫在程序編譯時會被鏈接到目標代碼中,程序運行時將不再需要改靜態庫;而動態庫在程序編譯時并不會被鏈接到目標代碼中,只是在程序運行時才被載入,因為在程序運行期間還需要動態庫的存在。

      iPhone官方只支持靜態庫聯編,本文就以靜態庫為例講解iPhone中靜態庫的具體用法。在實際的開發過程中,可能在項目設計階段把一些功能比如圖形界面引擎、網絡通訊引擎等都規劃到相應的函數庫中。

      打開XCode新建一個項目,選擇Library下的“Cocoa Touch Static Library”并命名為“FirstLibrary”。這個新建的靜態庫項目下除了“FisrtLibrary_Prefix.pch”外沒有任何程序文件,在Classes文件夾上點右鍵選擇“New File…”,然后在“Cocoa Touch Class”下選擇“Objective-C class”,筆者在這里先創建Objective-C風格的源文件和頭文件并命名為“function”,可以看到在Classes目錄下產生了function.h和function.m文件。接著在頭文件里輸入以下內容:

      #import 《Foundation/Foundation.h》

      @interface function : NSObject {

      }

      - (int)getMax:(int)a b:(int)b;

      - (int)getMin:(int)a b:(int)b;

      @end

      實現文件function.m內容如下:

      #import “function.h”

      @implementation function

      - (int)getMax:(int)a b:(int)b

      {

      return a 》 a?a:b;

      }

      - (int)getMin:(int)a b:(int)b

      {

      return a 《 b?a:b;

      }

      @end

      可見,筆者的這個靜態函數庫的功能很簡單,就是提供了兩個獲取最大值和最小值的函數。但是可能大多數現存的函數庫的源碼都是C或者C++格式的,沒關系,iPhone對C/C++支持的也很好。在Classes文件夾上點右鍵,選擇“New File…”,這次選擇Mac OS X下的“C and C++”,之后選擇“C File”并命名為“TestCFunction”,可以看到在Classes目錄下產生了兩個文件“TestCFunction.h”和“TestCFunction.c”,TestCFunction.h如下:

      #ifndef TestCFunction_H_

      #define TestCFunction_H_

      void swapValue(int* a,int* b)

      {

      int temp = 0;

      temp = *a;

      *a = *b;

      *b = temp;

      }

      #endif

      TestCFunction.c文件內保持為原樣。

      至此,這個靜態函數庫已經編寫完畢,盡管很簡單,但是包含了Objective-C風格和C風格的源代碼文件在內,編譯這個程序會看到在Products目錄下產生了名為“libFirstLibrary.a”的靜態庫文件。

      新建一個“Window-based Application”項目并命名為“FirstLibraryTest”,下面筆者會演示如何在這個新項目里利用前面生成的靜態庫libFristLibrary.a文件。

      ¨ 首先,拖拉靜態庫里的“FirstLibrary.xcodeproj”文件到新項目的Frameworks目錄下(當然也可以通過右鍵點Frameworks-》Add-》Existing Files.。添加),如下圖:

      

      圖1

      ¨ 然后選擇“FristLibrary.xcodeproj”文件,選擇右邊編輯窗口中的最后一項,這樣就將靜態庫添加到項目中了,如下圖:

      

      圖2

      ¨ 在將靜態庫添加到項目中后,需要在項目和靜態庫之間建立“Direct Dependencies(所謂的依賴關系)”。在“Targets”目錄下選擇“FirstLibraryTest”,然后快捷鍵Cmd+i(或者右鍵選擇Get Info)可以看到項目的依賴信息,如下圖:

      

      圖3

      點擊“Direct Dependencies”下方的“+”按鈕,會出現下圖:

      

      圖4

      選擇“FirstLibrary”并點擊“Add Target”,這樣就建立了項目和靜態庫之間的“依賴關系”,在項目編譯階段,程序會到靜態庫中查找相應的目標文件。

      ¨ 接下來使用靜態庫中的函數,修改頭文件FirstLibraryTestAppDelegate.h如下:

      #import 《UIKit/UIKit.h》

      #import “function.h”

      #include “TestCFunction.h”

      @interface FirstLibraryTestAppDelegate : NSObject 《UIApplicationDelegate》 {

      UIWindow *window;

      function* iFunc;

      }

      @property (nonatomic, retain) IBOutlet UIWindow *window;

      @end

      修改相應的實現文件如下:

      #import “FirstLibraryTestAppDelegate.h”

      @implementation FirstLibraryTestAppDelegate

      @synthesize window;

      - (void)applicationDidFinishLaunching:(UIApplication *)application {

      iFunc = [[function alloc] init];

      int a = 3,b = 6;

      int max = 0,min = 0;

      max = [iFunc getMax:a b:b];

      min = [iFunc getMin:a b:b];

      NSLog(@“max = %d,min = %d”,max,min);

      int c = 8,d = 22;

      swapValue(&c, &d);

      NSLog(@“after swapValue c = %d,d = %d”,c,d);

      // Override point for customization after application launch

      [window makeKeyAndVisible];

      }

      - (void)dealloc {

      [window release];

      [super dealloc];

      }

      @end

      編譯下,會發現項目無法編譯通過,錯誤信息如下:

      error: function.h: No such file or directory

      就是說,項目無法找到相應的靜態庫的頭文件,從而也就無法在項目和靜態庫之間建立“依賴關系”,所以需要在項目的“依賴信息選項”里告訴項目它所依賴的靜態庫頭文件的位置信息,如下圖設置靜態庫頭文件的位置信息:

      

      圖5

      最后再編譯一下,順利通過,輸出信息如下:

      [Session started at 2009-11-20 10:52:22 +0800.]

      2009-11-20 10:52:23.805 FirstLibraryTest[768:207] max = 6,min = 3

      2009-11-20 10:52:23.807 FirstLibraryTest[768:207] after swapValue c = 22,d = 8

      有時候程序會出現如下錯誤信息:

      

      圖6

      這是因為在靜態庫里使用了Objective-C風格的源文件,需要在項目的“依賴關系信息項”里設置如下:

      

      圖7

      添加內容項為“-ObjC”。

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    主站蜘蛛池模板: 联智通达_工控一体机_工业触摸一体机_工业一体机_工业触控一体机_POS机主板_工控主板_国产化主板_RK3588主板厂商-联智通达 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 心理咨询室设备_音乐放松椅_心理测评系统_情绪宣泄设备厂家 | 铸铁型材_灰铁棒_球铁棒_圆铁棒生产厂家★河北起昌精密装备制造有限公司 | 制砂机-合金-耐磨锤头-耐磨衬板-铸造件厂家-巩义市豫园宏宇铸造有限公司 | 汽车蓄电池配件_蓄电池维护保养产品_叉车电池配件研发生产厂家—联鸿能源 | 线路板生产厂家|电路板快板打样|PCB工厂价格|江西锦宏电子有限公司|PCB版加工定制 | 小型静音无油空压机价格-医用无油制氧空气压缩机-浙江盛源水润滑空压机制造有限公司 | 山东向阳电子科技有限公司-多用户集中式电能表生产厂家,NB物联网水表,刷卡水电表生产厂家,泰安智能水电表价格 | 混凝土修补-清水混凝土保护剂-仿清水混凝土-混凝土装修-混凝土色差处理-混凝土色差修复剂-德州唐荣建筑装饰工程有限公司 | 三亚酒吧KTV会所 专业舞台音响灯光 智能影音 会议音响工程 首选海南东演音响公司 | 手动叉车|电动搬运车|电动升降平台-牛力机械制造有限公司官网 | 扬州华工电气有限公司|环氧树脂管|金刚石绝缘板|U型绝缘槽|电解槽绝缘材料 | 精细筛-振动筛-滚筒筛-摇摆筛-平面回转筛-筛分机械设备-新乡德科筛分机械公司 | 泡酒配方大全-泡药酒专业的网站-泡酒之家 | 泰州LOGO设计-品牌VI设计-泰州广告设计公司-大唐歌飞广告设计公司 | 吉林省新思路教育发展有限公司 | 智能化会议系统|多媒体会议系统|无纸化会议系统|会议音箱|高清视频会议终端|智能化会议室|会议系统|视频会议系统-深圳市航视达科技有限公司 | 南通出国劳务公司-如东海外经济技术合作有限公司-启东,海门,如皋,海安出国劳务 | 暨南大学穗华口腔医院【官网】| 南京企业宣传片制作,广告形象片,影视制作,宣传片拍摄,微电影拍摄制作公司 | 无锡艾迅自动化科技ASCO电磁阀-dwyer/topworx代理-上泰仪表代理商 | 氯化亚铜_氯化亚铜厂家_衡水丰亿工贸有限公司 | 硬度计,里氏硬度计,布氏硬度计,高强螺栓检测仪,平板导热仪,专业无损检测仪器商-北京时代新天测控技术有限公司-北京时代新天测控技术有限公司 | 深圳市佳顺优印印刷有限公司,佳顺优印,画册印刷,海报印刷,封套印刷,手提袋印刷,包装盒印刷,彩盒印刷,无碳纸印刷,不干胶印刷,信封印刷,便笺印刷,笔记本印刷,台历印刷,挂历印刷,国际会展中心附近印刷厂,宝安印刷厂,宝安教材印刷厂 | 郑州空气能热水器,郑州空气能热水器经销商,郑州空气能热水器维修,郑州空气能热水器安装 | 柚墨yomoer官网_PPT模板_工作总结PPT模板下载_个人简历模板 | 原子灰厂家—长兴宝迪环保科技有限公司【官网】 | 厦门电脑维修_上门维修电脑_笔记本电脑维修_办公设备维修 - 耐诚 | 中派康明斯发电机_玉柴发电机厂家_静音移动拖车发电机-深圳市斯坦福电力设备有限公司 | 山东岱新起重机械有限公司,单梁桥式起重机,双梁桥式起重机,通用式门式起重机,欧式起重机系列 | 智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒 | 南通海拓机械有限公司|剪板机|折弯机|卷板机|开卷校平线 | 亚澳农机-亚澳南阳农机股份公司,旋耕机,旋播机,旋播施肥机,免耕播种机,旋耕播草多用机,果园机械-首页 | 深山工作室提供网络投票系统|微信公众号投票|微信公众号小程序|抖音小程序|百度小程序|微信公众号开发|企业网站建设 | 河北永生食品有限公司,益宁挂面, 香海园 | 五金冲压厂家_五金冲压件加工_微细孔加工-深圳市浩鑫精密五金制品有限公司 | 氢能展,氢能展会,燃料电池展,加氢设备_氢气储运_制氢设备_氢燃料汽车_加氢站成套设备 | 唐山森林光线影视文化有限公司| 新密耐火材料厂家价格-河南郑州荣盛窑炉耐火材料有限公司 | 邮政纸箱_淘宝纸箱_抗压纸箱,盐城纸箱,盐城纸箱厂家,盐城承重纸箱-盐城君雅纸箱 |