最近一个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. matplotlib作图——plot() 线图

    线图 #定义 matplotlib.pyplot.plot() plot([x], y, [fmt], data=None, **kwargs) plot([x], y, [fmt], [x2], y ...

  2. 企业级web nginx服务优化

    1.1)隐藏nginx header 内版本号信息 [root@aliyun ~]# vi /application/nginx/conf/nginx.conf http{ …… server_tok ...

  3. vim批量注释与取消批量注释(转)

    方法一 块选择模式 插入注释: 用v进入virtual(可视化)模式(可以省略这一步) 用上下键选中需要注释的行数 按ctrl+v进入可视化块模式 按大写I进入插入模式,输入注释符‘#’或者是‘//’ ...

  4. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  5. HDU - 1151 Air Raid (最小路径覆盖)

    题意:给定一个有向无环图,求最少划分几条路径,使之能够覆盖所有点. 分析:这可以转化为DAG上的最小路径覆盖问题. 路径覆盖的定义:有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且 ...

  6. linux比较两个文件的不同(6/21)

    cmp 命令:比较任意两个类型的文件,且吧结果输出到标准输出,默认文件相同不输出,不同的文件输出差异 必要参数 -c 显示不同的信息-l 列出所有的不同信息-s 错误信息不提示 选择参数 -i< ...

  7. python步长为负时的情况

    Sequence[start:end:step] python 的序列切片中,第一个:隔离了 起始索引 和 结束索引,第二个:隔离了 结束索引和 步长 step为正,则从左到右切片,如果 start ...

  8. ping主机脚本

    #!/bin/bash #ping net='172.16.1' uphosts=0 downhosts=0 for i in {1..254};do ping -c 1 -w 1 ${net}.${ ...

  9. 配置内核 Makefile:1449: *** mixed implicit and normal rules. Stop.【转】

    本文转载自:https://blog.csdn.net/bitowang/article/details/8446494 在编译内核的时候提示Makefile:1449: *** mixed impl ...

  10. 高亮显示UILabel中的子串

    I. 用户在搜索框中,输入关键字进行检索时,APP对搜索结果进行显示,有以下两种情况: 1. 匹配一次,如检索关键字为人名 这种情况,实现比较容易.写一个UILabel的category, 用rang ...