将dylib库嵌入macOS应用的方法
![]()
写作是一种习惯,稍微松懈,也许失去的就很多。过了一个年,居然很多天都没有更新,幸福的代价吧:)
标题的问题其实以前碰到过,不过当时在iOS,所以随手处理了没有重视。
而这次是在macOS,所使用的库,本身已经用brew安装过,所以本机调试没有发现这个问题。
等到拷贝到用户的机器上,突然发现程序无法启动,查看log才发现库没有找到。而实际上当时,我已经很确认的将dylib库文件打包到了app中。
随后发现macOS的dylib采取了比较特殊的机制,每个文件都内置有完整的路径名,如果不把dylib文件放置到这个路径上去,应用调用dylib的时候就会报错找不到库文件。
官方推荐的解决的方法是将库文件及头文件打包编译为Frameworks,随后引入到项目中。不过对于很多gnu的跨平台程序员,肯定不希望单独为macOS来写一个Xcode工程。
所以我建议还是使用内置的工具来修改这个执行路径,步骤如下:
- 假设我们的库文件名为libabc.0.dylib,通常是放置在/usr/local/lib文件夹中,为了不影响macOS下面其它应用对这个库的调用,我们首先把这个文件拷贝出来到我们的开发工作目录。
- 使用
otool -L libabc.0.dylib命令来查看这个库内置的路径名,没有意外的话,应当是/usr/local/lib/libabc.0.dylib。 - 修改dylib文件中保存的文件路径:
install_name_tool -id @executable_path/../Frameworks/libabc.0.dylib libabc.0.dylib
注意修改之后的路径@executable_path/../Frameworks/libabc.0.dylib,这个是app中的Frameworks目录,许多引用的框架和sdk内置的dylib文件,编译时候会放置到这里。
4. 随后在程序中正常引用dylib的头文件,注意.h头文件要拷贝到开发目录或者在工程中设置搜索路径来引用。
5. 在工程设置的General->Embedded Binaries中引入所使用的库文件libabc.0.dylib,这是保证app编译链接的时候能够正常通过。我记得Xcode7还是什么版本中,在这里银如意了库文件,库文件就会被自动的加入到Frameworks目录,但也许是不是sdk内置的库文件,只在这里引用解决了链接问题,但并不能自动把dylib库文件打包到app中。
6. 在工程设置的Build Phases中,点左上角“+”,选择Embed Libraries,然后在其中选择Destination为Frameworks,其它项目保持默认值不变。把libabc.0.dylib文件拖过来到本项目下面的列表中。这样编译的时候,才会把库文件打包到app的Frameworks文件夹。
做完了以上这些,编译出来的app应用就能正确的调用自己包中的库文件了。
将dylib库嵌入macOS应用的方法的更多相关文章
- 转一个 Xcode 7 缺少 *.dylib库的解决方法
Xcode7中 Link Binary With Libraries 没有 .dylib库,只能找到对应的 .tbd,但不能代替使用,通过查找资料,尝试后得到以下两种解决方法. 方法1. (heqin ...
- qt添加cef库嵌入web [转]
qt cef嵌入web 原文http://blog.sina.com.cn/s/blog_9e59cf590102vnfc.html 最近项目需要,研究了下libcef库. Cef(Chromium ...
- 库不存在的排查方法:ImportError: No module named selenium2Library
解决办法: 把selenium2Library改成Selenium2Library 安装下面四个: python-2.7.13.amd64.msi robotframework-ride-1.5. ...
- Anaconda 安装 Python 库(MySQLdb)的方法
[已解决]Anaconda 安装 Python 库(MySQLdb)的方法 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 201 ...
- 一种在BIOS中嵌入应用程序的方法及实现
本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改.文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证. 正 ...
- VC中加载LIB库文件的三种方法
VC中加载LIB库文件的三种方法 在VC中加载LIB文件的三种方法如下: 方法1:LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中&quo ...
- 关于阿里云ECS Centos 5/6/7 Linux Glibc库严重安全漏洞修复方法
日前Linux GNU glibc标准库的 gethostbyname函数爆出缓冲区溢出漏洞,漏洞编号为CVE-2015-0235.黑客可以通过gethostbyname系列函数实现远程代码执行,获取 ...
- 树莓派4B 更新wiringPi库到2.52的方法的wiringPi库2.5.2版本wiringpi-latest.deb下载
树莓派4B 更新wiringPi库到2.52的方法 – 树莓派中文站 http://www.52pi.net/archives/1918 通过如上链接可知,需要通过如下命令下载wiringpi-lat ...
- 基于bs4库的HTML标签遍历方法
基于bs4库的HTML标签遍历方法 import requests r=requests.get('http://python123.io/ws/demo.html') demo=r.text HTM ...
随机推荐
- windows下apache+https环境配置
windows下apache+https环境配置 转 https://www.cnblogs.com/sandaizi/p/7519370.html 1.修改配置文件conf/httpd.conf,去 ...
- onenote使用教程
1. OneNote的基础功能 随处可以记录笔记 收集页面 微信关注公众号 [微软云笔记] IE和Chrome等浏览器扩展-OneNote Clipper 通过绘图实现手绘效果 插入音频与视频 实现多 ...
- quartz之CronExpression表达式
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为1.秒(~).分钟(~).小时(~).天(月)(~,但是你需要考虑你月的天数).月(~).天(星期)(~ =SUN 或 SU ...
- JavaScript处理null、undefined和空值
最近一直在写前端,在使用jquery的ajax请求然后处理返回值的时候,经常会遇到返回值为undefined或者"null"的情况,很是头疼,而返回接口是来自于其他公司的,所以这种 ...
- css 控制横向布局,超出隐藏,滚动
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...
- DataTable的Merge\COPY\AcceptChange使用说明
在C#内使用DataTable的Merge().Copy().AcceptChange().Clone()方法的用途如下: 1.Merge()可将两个不同的表结构的表进行合并,合并后新表的列为之前两表 ...
- 在Linux上搭建测试环境常用命令(转自-测试小柚子)
一.搭建测试环境: 二.查看应用日志: (1)vivi/vim 原本是指修改文件,同时可以使用vi 日志文件名,打开日志文件(2)lessless命令是查看日志最常用的命令.用法:less 日志文件名 ...
- 一文教你看懂大数据的技术生态圈:Hadoop,hive,spark
转自:https://www.cnblogs.com/reed/p/7730360.html 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞 ...
- codeforces 13 D
给你500个红点和蓝点,让你找多少点红点构成的三角形里没有蓝点. 巧妙啊!我们考虑一个很远位置的点,不妨设这个为O,然后n^2枚举红点,考虑Oij里面蓝点的个数, 然后 对于 ijk这个三角形,我们可 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...