将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 ...
随机推荐
- python3.X中try/except
包含try...except...在3.x版本中与2.x版本中的用法差异. 1.先说差异: 在2.x的python中用法实例: try: ...... except Exception,e: rais ...
- 短网址API
http://tao.tf/open/ API简介 API允许第三方自由调用URL缩短,基于text/json/jsonp/js模式,支持post.get提交. 支持缩短网址: 淘宝网(*.taoba ...
- 使用GitHub作为Maven仓库并引用
网上太多的博客都是那些傻逼抄袭,然后直接复制粘贴然后就成为自己的博客了,这种人,真的很欠揍,我在网上查了一个下午的资料,终于找到一个写得非常详细的兄弟 链接如下:https://blog.csdn.n ...
- tomcat部署项目启动采坑之UnknownHostException
在一台新服务器上,把war包部署在tomcat上,很普通的很简单的一个活,但我踩到一个大坑. 需要组件tomcat8,mysql5.7,mosqquito1.5,centos7,war包,把组件都装好 ...
- 2019年3月2日-小雨.md
2019年3月2日, 星期六 开学已经一周了,时间好像限制了自己进步的脚步,一个人的精力有限,想做好方方面面实在是太难了,有很多事儿最后都没做的完美.相反,自己应该放下繁琐的包袱,简简单单的干一件事儿 ...
- URI ,URL 和 URN
URI : 统一资源标识符,用来唯一标识互联网资源,包括URL和URN URL:统一资源定位器 包含: 协议,域名,端口,路由,参数,hash https://i.cnblogs.com/EditPo ...
- IIS 设置
解决办法:1. 1).通过webconfig中增加模拟,加入管理员权限, <identity impersonate="true" userName="系统管理员& ...
- 不定高元素的高度transition动画实现
分析文档描述 CSS 支持动画的属性中的 height 属性如下: height :yes, as a length, percentage or calc() 即:当 height 的值是 leng ...
- Prometheus 自定义exporter 监控key
当Prometheus的node_exporter中没有我们需要的一些监控项时,就可以如zabbix一样定制一些key,让其支持我们所需要的监控项. 例如,我要根据 逻辑cpu核数 来确定load的告 ...
- 我用linux系统的采坑记
我的新Ubuntu18,也没安装什么,但是在使用过程中总是莫名其妙的卡死,真的很烦.有时候cpu使用率接近100%,有时候貌似是内存不够了,但是我明明是8GB,这些小问题搞得我很恼火.这样的机器真的不 ...