所谓dylib,就是bsd风格的动态库。基本可以认为等价于windows的dll和linux的so。mac基于bsd,所以也使用的是dylib。

如果你需要引用一个第三方的dylib,在xcode下编译出cocoa程序,在本机上运行是不会出问题的。但是发布出来,给其他用户用,就可能出问题。因为用户不一定有这个库。

这个问题给我造成了相当的困扰,我到现在也没找到正规的方法。但是我确实解决了这个问题,虽然方法不一定正宗。不管怎么说,写下来,如果暂时没有更好的办法,那么先这样做。如果谁有更好的办法,也请一定不吝留言或邮件给我

我的办法是这样的:

1 otool -L yourapp.app/Contents/MacOS/yourapp

这一步的意思是对你编译出的app使用otool命令,以便获得依赖哪些dylib的信息。注意这个路径。cocoa的app在命令行下表现为目录。所有相关的东西都在里面。
结果如下所示:
yourapp.app/Contents/MacOS/yourapp:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
/usr/local/lib/lib01.dylib (compatibility version 0.0.0, current version 0.1.0)
/usr/local/lib/lib02.dylib (compatibility version 0.0.0, current version 0.1.0)
/usr/local/lib/lib03.dylib (compatibility version 0.0.0, current version 0.1.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.0.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.0.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.12.0)

注意我标红的地方。假如lib01,lib02,lib03是本程序引用的第三方库,那么在这个程序里面,他们的引用地址是位于/usr/local/lib上的。这是开发机上的安装情况。而使用这个程序的客户机未必安装这些东西,所以程序就要出错。

显然,我们需要做2件事。a 把这些库附带在app上 b 把他们的引用地址修改到正确的位置。

2 mkdir yourapp.app/Contents/dylib

在编译出来的app中,创建dylib目录

然后把所有需要的库复制过去

cp /usr/local/lib/lib01.dylib yourapp.app/Contents/dylib/
cp /usr/local/lib/lib02.dylib yourapp.app/Contents/dylib/
cp /usr/local/lib/lib03.dylib yourapp.app/Contents/dylib/

3 install_name_tool -change /usr/local/lib/lib01.dylib @loader_path/../dylib/lib01.dylib "yourapp.app/Contents/MacOS/yourapp"

install_name_tool 是苹果提供的用来修改dylib安装名称的命令。这个命令执行之后,再用otool -L 就可以看到变化了

yourapp.app/Contents/MacOS/yourapp:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
@loader_path/../dylib/lib01.dylib (compatibility version 0.0.0, current version 0.1.0)
/usr/local/lib/lib02.dylib (compatibility version 0.0.0, current version 0.1.0)
/usr/local/lib/lib03.dylib (compatibility version 0.0.0, current version 0.1.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.0.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.0.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.12.0)

注意标红的位置。已经变化了。@loader_path 指的是应用程序运行的位置,也就是yourapp.app/Contents/MacOS/yourapp,所以要用一个..,以便定位到第2步创建的dylib目录。
重复这个命令,修改lib02,lib03

4 otool -L yourapp.app/Contents/dylib/*.dylib

继续用otool 来检查dylib下面使用的第三方库是否还有其他依赖,install_name是否正确,重复1,2,3的步骤,把所需要的dylib复制过来,修改install_name。

如果都改对了,那么这个app就附带上了dylib,可以在其他机器上正确运行了,不用非要寻找/usr/local/lib下面的库了。

刚才我们修改的结果是一个build的结果。当然,每次build都这么折腾一下很麻烦。所以继续这样做:

1 前面的步骤得到了一个完整的dylib目录。把这个dylib复制一份备用。比如放在你的xcode项目下面。

2 编写一个脚本:

mkdir "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/dylib"
cp -f /your/path/to/xcode_project_name/dylib/*.dylib "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/dylib/"

install_name_tool -change /usr/local/lib/lib01.dylib @loader_path/../dylib/lib01.dylib "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME"
(用这个格式重复前面对app使用过的dylib)

3 在xcode中,展开targets节点,右键点工程名称,在菜单中选Add->New Build Phasa->New Run Script Build Phasa,在打开的对话框里面,把刚才的脚本贴进去。如图所示。

这个脚本会在build之后自动运行。不过我这里有个奇怪的问题,如果Shell里面写了/bin/sh,会报告找不到这个文件(实际上存在),而让shell为空,反而可以正确的运行shell命令。

经过这些处理,每次编译出来的app就可以拿到其他机器上运行了。可真够麻烦的...

转自:http://blog.csdn.net/dadalan/article/details/4335833

by:yangchen

【转】otool 与dylib相关推荐

  1. dylib java_将dylib库嵌入macOS应用的方法

    写作是一种习惯,稍微松懈,也许失去的就很多.过了一个年,居然很多天都没有更新,幸福的代价吧:) 标题的问题其实以前碰到过,不过当时在iOS,所以随手处理了没有重视. 而这次是在macOS,所使用的库, ...

  2. python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案

    Mac os x 升级到最新版后出现 python MysqlDB 无法找到 libmysqlclient.18.dylib 的问题,尝试的解决方案如下: 1.  升级更新 mysql 到最新版,无效 ...

  3. dylib java_使用单声道可执行文件捆绑.dylib文件

    我有一个应用程序,我想将特定的dylib与它捆绑在一起 . 我正在使用"dylibbundler"将dylib和依赖项复制到可执行文件夹 . 这是我正在使用的命令: dylibbu ...

  4. lipo otool 动态库、静态库的生成

    查看库是否是动态库 如果是动态库则会有 Mach-O dynamically linked shared library标记 file xxxx.a file xxxx.framework/xxxx ...

  5. linux下的逆向工具有哪些,iOS逆向(八)逆向工具 otool 介绍

    otool工具简介 Mac OS X下二进制可执行文件的动态链接库是dylib文件. 所谓dylib,就是bsd风格的动态库.基本可以认为等价于windows 的dll和linux的so.mac基于b ...

  6. MAC查看库信息/rpath(类似ldd)otool

    比如: otool -L libfontmanager.dylib 实际使用效果不怎样.如果缺少一个lib,并不会提醒找不到.

  7. 类似LINUX上的ldd,MAC使用otool查看库的链接库

    具体来说: otool -L libfontmanager.dylib

  8. 专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook

    专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互 ...

  9. could not load inserted library: /usr/lib/libgmalloc.dylib

    本人也刚开始学习iphone开发,最近维护一个程序时,不知道怎么弄的,不能build到真机了,到模拟器没有什么问题,出现的错误是 : ---->>>could not load in ...

  10. libc++abi.dylib: terminate_handler unexpectedly threw an exception

    在执行一个界面的时候,就是一直libc++abi.dylib: terminate_handler unexpectedly threw an exception.也没有指明是哪里错误,后来经检查发现 ...

最新文章

  1. 创建数据库,指定数据库的字符集和编码顺序
  2. springboot集成freemarker 配置application.properties详解
  3. android检查usb广播,Android 检测USB 音频设备
  4. MySQL与会计报表_会计报表的18项必须审核的数据
  5. Codeforces 993C. Careful Maneuvering(详细注解)
  6. Windows下访问VirtualBox的mysql服务
  7. Spring Boot使用hikari、druid、c3p0等数据库连接池详解
  8. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(上)
  9. Android学习笔记25-画廊控件Gallery的使用
  10. Android 录屏(录像)录制视频自定义输出视频分辨率,设置最合适尺寸;Android Mediacodec 录屏输出视频被缩小,Android 录屏全屏,录屏自定义尺寸,录屏录像黑边
  11. html页面在线预览PDF文件
  12. mac录屏快捷键 - mac截图截屏快捷键 - 自带录屏软件QuickTime Player如何使用
  13. 【Y9000P 2022 GTX3060 CUDA安装记录】
  14. 百度地图、高德地图、腾讯地图比较
  15. then 微信小程序_微信小程序异步处理
  16. 【全】各种颜色对应的 Hex code 和对应的 RGB 值
  17. Kafka主题(Topic)的管理
  18. php邮箱类,php邮件类(PHPMailer)使用心得
  19. 给expvarmon插上数据持久化的“翅膀”
  20. wordpress添加媒体_如何在WordPress中添加精选内容滑块

热门文章

  1. 制作一个简易的即时聊天工具
  2. CAJ云阅读怎么用,可以修改caj文件吗?
  3. Unity发布Android时需要的Android SDK/NDK的下载
  4. 老韩思考:一个卖豆腐的能转行IT吗? 你的卖点在哪里?
  5. MySQL—内连接和外连接区别
  6. Zabbix全网监控
  7. Android so文件浅析
  8. mysql utf8 bom_UTF8的BOM
  9. 问题:C语言习题5.22 - 学生成绩的处理
  10. 支付宝小程序平台的IM聊天插件