将dylib库嵌入macOS应用的方法

写作是一种习惯,稍微松懈,也许失去的就很多。过了一个年,居然很多天都没有更新,幸福的代价吧:)

标题的问题其实以前碰到过,不过当时在iOS,所以随手处理了没有重视。 而这次是在macOS,所使用的库,本身已经用brew安装过,所以本机调试没有发现这个问题。 等到拷贝到用户的机器上,突然发现程序无法启动,查看log才发现库没有找到。而实际上当时,我已经很确认的将dylib库文件打包到了app中。

随后发现macOS的dylib采取了比较特殊的机制,每个文件都内置有完整的路径名,如果不把dylib文件放置到这个路径上去,应用调用dylib的时候就会报错找不到库文件。 官方推荐的解决的方法是将库文件及头文件打包编译为Frameworks,随后引入到项目中。不过对于很多gnu的跨平台程序员,肯定不希望单独为macOS来写一个Xcode工程。 所以我建议还是使用内置的工具来修改这个执行路径,步骤如下:

  1. 假设我们的库文件名为libabc.0.dylib,通常是放置在/usr/local/lib文件夹中,为了不影响macOS下面其它应用对这个库的调用,我们首先把这个文件拷贝出来到我们的开发工作目录。
  2. 使用otool -L libabc.0.dylib命令来查看这个库内置的路径名,没有意外的话,应当是/usr/local/lib/libabc.0.dylib
  3. 修改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应用就能正确的调用自己包中的库文件了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏全华班

工作流学习-使用eclipse流程开发

阅读文本大概需要 5 分钟。 我们前文中介绍了Activiti,知道它是目前市面上比较流行的工作流框架。同时也简单指导大家从头开始搭建一下Activit...

3514
来自专栏IT技术精选文摘

Mysql读写分离原理及主众同步延时如何解决

其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去。

1892
来自专栏数据和云

快速掌握:大型分布式系统中的缓存架构

CDN(Content Delivery Network 内容分发网络)的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中...

792
来自专栏SpringBoot 核心技术

第一章:用一个HelloWord来阐述SpringBoot的简单与快速简介 本章目的系统要求开始构建项目项目目录结构初尝试运行项目编写HelloWordController总结

1082
来自专栏lgp20151222

Feign使用Hystrix无效原因及解决方法

首先,使用spring-cloud搭建微服务的过程大部分是根据网上的教程来的,由于网上教程的时间较早,而spring-cloud更新迭代较快,会造成依赖上的一些...

1222
来自专栏Java技术栈

SpringCloud Eureka自我保护机制

自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行。...

37710
来自专栏码匠的流水账

jib自定义entrypoint

jib的自定义entrypoint是0.9.10及以上版本才支持的,若需要自定义entrypoint,请先升级jib版本。

831
来自专栏一英里广度一英寸深度的学习

Hello,Java女神

第一阶段:C++转行,开始学习Java 第二阶段:Java Web,jsp+servlet 第三阶段:Struct Spring 第四阶段:Spring ...

1185
来自专栏hotqin888的专栏

ONLYOFFICE历史版本开发技术之二

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

2352
来自专栏王磊的博客

iBatis for Net 代码生成器(CodeHelper)附下载地址(已经升级为V 1.1)

CodeHelper是一款可以自己定义模板和生成内容的代码生成器,目前只支持MsSql数据库,这款代码生成器的初衷也只是为了生成MyBatis.net框架的配置...

3556

扫码关注云+社区