iOS编译集成linux开源c库的一些记录
最近一个iOS项目需要使用一些Linux下面的开源c库,说是Linux的其实是跨平台的,各种Unix系统都有支持。理论上iOS来自MacOS,而MacOS其实是一种兼容的Unix系统,所以这些库应该也可以在iOS上跑。当然了这些库并没有直接操作系统硬件的。
目的是在iOS中使用开源c库,那么第一步得能在Linux或Mac上编译他们吧,所以需要点一点Linux 编译安装c库的技能点。
最基本的就是gcc和make使用,但实际上直接提供Makefile的库很少,因为要跨平台,要处理各种依赖环境的不同,所以这些库很多都使用GUN的AutoTools系列工具编译,除此之外还有用CMake等工具的,不过不在本次研究范围内。
关于Autotools,这儿有一个教程,虽然版本较老,但是还可以看一看,里面有一个例子可以跟着做一做:https://www.lrde.epita.fr/~adl/autotools.html
使用Autotools编译的库,在Linux上基本上就是./Configure, make, make install三步就可以编译安装了,有的还需要一个脚本来生成Configure文件。这些库无论是静态库还是动态库都会被安装到Linux系统相应的目录中,比如usr/local/lib之类,而使用这些库的应用程序就可以指定链接他们。我也是刚点的技能点,就不多说了。总之就是linux下面基本上都是基于脚本和工具链编译的,这和iOS使用XCode组织工程有很大的不同。当然iOS实际上也可以用工具链编译,有些库就直接提供了iOS下面交叉编译的脚本。
搞定了Linux下面的编译,下面来看看iOS了。有几种情况:
1)可以将c库在Mac上交叉编译出iOS使用的静态库.a文件,这个.a文件是通过lipo工具合成的包含多个cpu架构的组合版本。比如libsodium库就提供了一个ios.sh编译脚本,一键生成头文件和.a,然后直接仍进XCode中使用,非常方便。研究他的这个ios.sh脚本,可以给其他库也做类似的交叉编译。但是我安装这个方法编译出来的mbedtls库虽然编译成功但是放到XCode中之后就会出现连接问题,说是找不到符号,使用-all_load后可以看到是因为min target不一致,但是更改后又出现说没有bitcode,我把工程的bitcode也关闭后居然又出现了更多的找不到符号,折腾了几个小时作为新手只好先放手了,转用第二种方式解决。
2)第二种方式就是直接把源代码加进来编译了。这个方法简单粗暴,但是也有一个问题。因为使用autotools的工具都会有个config.h文件,这个文件是autoscan工具搜索编译系统的环境自动生成的,也就是说如果你在Mac系统下面生成的config.h其实是反应了Mac系统的环境,如果想得到iOS系统的config.h,还是需要交叉编译,当然可以不编译,只是执行Configure就行。然后另一个问题是,如果你的XCode里面包含了几个这些的库,他们都有config.h,XCode可能会找不到哪个库用哪个config.h。有些比较良心的库会提供一个宏去定义一个替换的名称,我们需要在XCode里面设置,这个设置方法我也是搜了好久试了好几次才找到,在other c flags里面加入DXXCONFIG_NAME=’\”xx_config.h\”’ 注意使用”和\”。
使用c库后要注意的问题:
1)DEBUG宏定义问题。一般iOS开发,XCode会在debug版本定义DEBUG=1。但你加入c库后就郁闷了,因为有的c库会这么写:
#ifdef ENABLE_LOG
#define DEBUG(...) \
do { \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n"); \
} while (0)
#else
#define DEBUG(...) /* nothing */
#endif
看到了没,无论是否定义ENABLE_LOG,DEBUG宏都被重定义了。如果你的代码里面有这样基于DEBUG的判断可要小心了:
#if DEBUG
xxxx
#endif
DEBUG被重定义后,xxxx永远不会被执行了,因为现在DEBUG要么是一段代码,要么是空。你如果改成 #ifdef DEBUG,也不行的,因为DEBUG永远是有定义的,xxxx总被执行到。没办法只能自己再定义一个XXX_DEBUG的宏使用。万恶的C宏!
2)暂时记不清了,回头再补充
iOS编译集成linux开源c库的一些记录的更多相关文章
- 环信 之 iOS 客户端集成二:配置库
1. 添加依赖库 Build Phases → Link Binary With Libraries MobileCoreServices.framework CFNetwork.framework ...
- IOS一些高效的第三方框架库
MBProgressHUD ——进展指示符库 苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgres ...
- EasyRTMP实现的一套简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)RTMP直播推送库
本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52938980 EasyRTMP介绍 Easy ...
- ios很好的开源库
Tim9Liu9/TimLiu-iOS 自己总结的iOS.mac开源项目及库,持续更新.. 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD ...
- linux下编译qt5.6.0静态库——configure配置
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- iOS流行的开源代码库
本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- linux gcc 编译时头文件和库文件搜索路径
一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INC ...
随机推荐
- knockout 学习使用笔记------绑定值时赋值失败
在使用knockout绑定值的时候,发现无论怎么赋值都赋值失败,最后检查前端页面才发现,同一个属性绑定值的时候,绑定了两次,而在js中进行属性绑定的时候是双向绑定的,SO,产生了交互影响.谨记之. 并 ...
- pycharm断点调试
step over 执行下一步 蓝色高亮的那一行表示准备执行的代码
- 第三课 Makefile文件的制作(上)
1.序言: 前面的课程讲解了从gcc编译过程到其实践,大家可以看到其实在这些步骤中有些是可以简化编译的,但由于参数多以及项目中文件数量多的原因难免会造成错误甚至是浪费大量的时间在这编译上,为此linu ...
- 微信小程序之日期与时间插件
页面 <picker mode="time" value="{{time}}" start="{{minTime}}" end=&qu ...
- 负载均衡集群ipvsadm命令及基本用法
ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置.需要使用yum单独安装. 基本用法: ipvsadm COMMAND [protocol] service-addre ...
- jQuery UI 自定义样式的日历控件
在线演示 本地下载
- SpringBoot 通用Error设计
在项目中需要设计统一的错误消息,通常使用枚举类定义"错误码"与"错误消息": 并且也可以做错误消息自定义. 定义通过错误接口类:CommonError publ ...
- merge two sorted lists, 合并两个有序序列
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * Lis ...
- 子tab里面新增tab(top.jQuery)
top.jQuery应用. var jq = top.jQuery; if (jq("#centre").tabs("exists", "预览页面&q ...
- JNIjw02
1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw02.h" JNIEXPORT void JNICALL ...