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 ...
随机推荐
- GIT学习笔记(2):时光机穿梭与远程仓库
GIT学习笔记(2):时光机穿梭与远程仓库 撤销操作 1.GIT如何跟踪修改 在我们修改了代码内容后,执行了git add和git commit命令来将其交由Git进行版本控制.我们前面举的例子是这样 ...
- java byte为何范围是-128~127
从我们接触Java的时候,就被告知基础类型byte是一个字节,占8位,表示的范围是-128~127.那么为什么会这个范围呢? 咱们先回顾一下计算机基础: 1. 在计算机内部数据的存储和运算都采用二 ...
- Linux中top和free命令(6/15)
top:命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表. 该命令可以按CPU使用.内存使用和执行时间对任务进行排序: 而且该命令的很多特性都可以通过交互式命令或者在个 ...
- 拓扑排序(附LeetCode题目)
算法期中考到一题关于拓扑序的题目,觉得很值得一写. 1.什么是拓扑序? 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面.要注意的是,这是对有向 ...
- clipbrd剪切板查看器
本文,我们来学习一下简单的概念,即,如何查看系统剪贴版里面有什么内容? 如果要想看.或者验证系统剪贴版里面都有什么内容,最为简单的方法就是通过"粘贴"的操作来验证! 但是, ...
- 20145219 《Java程序设计》第05周学习总结
20145219 <Java程序设计>第05周学习总结 教材学习内容总结 try.catch 1.求平均数程序示例 import java.util.Scanner; public cla ...
- Win32 API编程:网络编程在设置WSAAsyncSelect模型后connect的返回值问题
通过WSAAsyncSelect()可以设置非阻塞异步套接字 ::WSAAsyncSelect(s, hDlg, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE ...
- Spring积累
<tx:annotation-driven/> (Spring的XML配置里两大Bean的声明之一) 那我们是否就可以在程序中所有被spring管理的类(@Controller.@Ser ...
- LeetCode——Keyboard Row
LeetCode--Keyboard Row Question Given a List of words, return the words that can be typed using lett ...
- 【Spark SQL 源码分析系列文章】
从决定写Spark SQL源码分析的文章,到现在一个月的时间里,陆陆续续差不多快完成了,这里也做一个整合和索引,方便大家阅读,这里给出阅读顺序 :) 第一篇 Spark SQL源码分析之核心流程 第二 ...