最近一个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库的一些记录的更多相关文章

  1. 环信 之 iOS 客户端集成二:配置库

    1. 添加依赖库 Build Phases → Link Binary With Libraries MobileCoreServices.framework CFNetwork.framework ...

  2. IOS一些高效的第三方框架库

    MBProgressHUD ——进展指示符库 苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgres ...

  3. EasyRTMP实现的一套简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)RTMP直播推送库

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52938980 EasyRTMP介绍 Easy ...

  4. ios很好的开源库

    Tim9Liu9/TimLiu-iOS 自己总结的iOS.mac开源项目及库,持续更新.. 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD ...

  5. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  6. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  7. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  8. iOS流行的开源代码库

    本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...

  9. linux gcc 编译时头文件和库文件搜索路径

    一.头文件    gcc 在编译时寻找所需要的头文件 :    ※搜寻会从-I开始    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INC ...

随机推荐

  1. GIT学习笔记(2):时光机穿梭与远程仓库

    GIT学习笔记(2):时光机穿梭与远程仓库 撤销操作 1.GIT如何跟踪修改 在我们修改了代码内容后,执行了git add和git commit命令来将其交由Git进行版本控制.我们前面举的例子是这样 ...

  2. java byte为何范围是-128~127

    从我们接触Java的时候,就被告知基础类型byte是一个字节,占8位,表示的范围是-128~127.那么为什么会这个范围呢?   咱们先回顾一下计算机基础: 1. 在计算机内部数据的存储和运算都采用二 ...

  3. Linux中top和free命令(6/15)

    top:命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表. 该命令可以按CPU使用.内存使用和执行时间对任务进行排序: 而且该命令的很多特性都可以通过交互式命令或者在个 ...

  4. 拓扑排序(附LeetCode题目)

    算法期中考到一题关于拓扑序的题目,觉得很值得一写. 1.什么是拓扑序? 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面.要注意的是,这是对有向 ...

  5. clipbrd剪切板查看器

    本文,我们来学习一下简单的概念,即,如何查看系统剪贴版里面有什么内容?   如果要想看.或者验证系统剪贴版里面都有什么内容,最为简单的方法就是通过"粘贴"的操作来验证!   但是, ...

  6. 20145219 《Java程序设计》第05周学习总结

    20145219 <Java程序设计>第05周学习总结 教材学习内容总结 try.catch 1.求平均数程序示例 import java.util.Scanner; public cla ...

  7. Win32 API编程:网络编程在设置WSAAsyncSelect模型后connect的返回值问题

    通过WSAAsyncSelect()可以设置非阻塞异步套接字 ::WSAAsyncSelect(s, hDlg, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE ...

  8. Spring积累

    <tx:annotation-driven/>  (Spring的XML配置里两大Bean的声明之一) 那我们是否就可以在程序中所有被spring管理的类(@Controller.@Ser ...

  9. LeetCode——Keyboard Row

    LeetCode--Keyboard Row Question Given a List of words, return the words that can be typed using lett ...

  10. 【Spark SQL 源码分析系列文章】

    从决定写Spark SQL源码分析的文章,到现在一个月的时间里,陆陆续续差不多快完成了,这里也做一个整合和索引,方便大家阅读,这里给出阅读顺序 :) 第一篇 Spark SQL源码分析之核心流程 第二 ...