g87616758 发表于 2015-12-30 11:42:08

iPhone调用MAC OS X上C/C++写的.dylib问题(二)

发表于 2011 年 03 月 19 日 由 正正
  Author 正正 Date 2011.03.02 10:19:00   转载请注明出处 正正博客 http://www.2009fly.com
  最近有一个项目是需要在Android上和iOS上同时运行,然而Android上官方提倡的是Java来写应用,iOS上需要用Objective-C来书写,然而我们并不想同时维护两个代码,考虑跨平台和通用性,我们决定要用C来写底层,然后给客户提供高层的接口。
  目前有一个难题是:怎样用OC(Objective-C)去调用C写的.dylib库?用工具链,未免太麻烦,而且只能在真机上测试(参考资料1)【iOS的模拟器不同于Android,Android类似一个虚拟机,实质上就是一个虚拟机,模拟的是真机上的运行环境。而iOS只是一个软件的模拟器,并不是一个真机的运行环境!iOS模拟器上运行的是x86机器,而iPhone真机上是ARM机器码;Android上都是ARM架构的机器码】。于是我打算用MAC工程中的dylib来写程序,需要注意的是:我们的程序只是prue C程序,不会调用framework框架里边的内容,如果你的程序需要调用framework里面的类库的话,请不要建立MAC的dylib工程来如此操作,目前的话,估计只能用toolChains(参考资料2)!
  然后就是编写程序,编写prue C的BSD C Library工程,省略!
  现在看看我们怎么来调用,我们新建立一个iPhone的工程View-based Application。然后再工程右边的Classes添加我们导出函数的头文件,在Frameworks添加我们的动态链接库.dylib文件。现在我们编写一个函数来调用我们动态库中的函数,编译、链接没问题,但是运行时候—–》出错了!提示/usr/local/lib/libHelloC.dylib错误,呵呵,没关系,这是因为我们的可执行程序HelloWorld找不到其调用的libHelloC.dylib,你可以用otool工具:
  $otool –L HelloWorld
  去查看其依赖的包位置,发现在/usr/local/lib/libHelloC.dylib中,你可以把你生成的dylib文件拷贝到HelloWorld.app同一个目录中,这样子程序自己回去找dylib!
  第二个解决方案是你可以借助于install_name_tool工具:$ install_name_tool -change /usr/local/lib/libHelloC.dylib /Users/zzc/Desktop/HelloC/build/Debug/libHelloC.dylib HelloWorld
  将其定位到你的libHelloC.dylib生成的目录,这样子便于调试,要发布到真机上,请定位到你要定位的位置!其实,最简单的方式是你自己放在自己的可执行文件下面,这样子更简单写!【在真机上我没有测试,最后几句话只是臆测!】
  我们再用otool看看:
  $otool -L HelloWorld
  HelloWorld:
  /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 751.49.0)
  /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 1400.0.0)
  /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 600.0.0)
  /Users/zzc/Desktop/HelloC/build/Debug/libHelloC.dylib (compatibility version 1.0.0, current version 1.0.0)
  /usr/lib/libSystem.dylib (compatibility version 1.0.0, current version 125.0.0)
  /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 550.52.0)
  /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
  还有一个上上篇关于前一篇博文的,libSystem.dylib 是libSystem.B.dylib的一个软链接(ln –l ),这个库是c的标准库!
  上面所有的内容参考率参考资料3
  参考资料:
  1、 IPhone 开发环境搭建之失败的第一步
  http://www.2009fly.com/index/a/yidongkaifa/iPhone/rumen/iPhonegaoji/2011/0303/688.html
  2、 在2009fly.COM搜索toolchain的参考结果
  http://www.2009fly.com/index/plus/search.php?domains=www.2009fly.com&kwtype=0&q=toolchain&searchtype=titlekeyword&client=pub-9280232748837488&forid=1&ie=UTF-8&oe=UTF-8&safe=active&cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%23336699%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3AFFFFFF%3BLBGC%3A336699%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BFORID%3A1&hl=zh-CN
  3、 XCode、Cocoa开发中使用第三方dylib的方法
  ====================================================================
  版权所有,欢迎转载,请在转载前注明原文出处:正正博客 http://www.2009fly.com
  尊重别人的劳动成果也就是尊重自己!
  推荐:2009FLY文摘|正正博客
  ====================================================================
收藏、分享这篇文章!

iPhone调用MAC OS X上C/C++写的.dylib问题(三)
页: [1]
查看完整版本: iPhone调用MAC OS X上C/C++写的.dylib问题(二)