最近一个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. js颜色选择器 制作分析

    给html元素设置事件监听, 触发事件 弹出颜色选择器 颜色选择器绘制 获取上次选择的颜色(当前颜色) 绘制渐变色板(canvas) (方法: 横轴渐变ff0000, ffff00, 00ff00, ...

  2. Behind The Cloud--浅析分布式系统背后的基础设施

     http://blog.csdn.net/it_yuan/article/details/8617127 Behind The Cloud--浅析分布式系统背后的基础设施 分类: 系统架构2013- ...

  3. s5_day2作业

    # 1:编写for循环,利用索引遍历出每一个字符 # msg = 'hello egon 666' # for i in range(len(msg)): # print(i,msg[i]) # 2: ...

  4. docker内域名无法解析问题

    进入 Docker 容器后,在 hosts 文件中,配置域名解析. # 进入 docker 容器 docker exec -it my_web /bin/bash # 修改 hosts 文件 vi / ...

  5. Lily hbase indexer搭建配置概要文档

    1.solrcloud搭建好2.hbase-solr-indexer服务开启3.确定hbase中的对应的表开启replication功能 create '} // 1表示开启replication 已 ...

  6. 异步消息postEvent更新界面

    其实就是和Qt::QueuedConnection时的信号槽一样,属于异步的. 1.新建QEvent子类 ①.头文件 #ifndef MYEVENT_H #define MYEVENT_H #incl ...

  7. 【React Native开发】React Native进行签名打包成Apk

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50525976 本文出自:[江清清的博客] (一)前言 [好消息]个人 ...

  8. springboot--配置文件加载顺序

    -file:./config(内部配置) -file:./ (内部配置) -classpath:/config (外部配置) -classpath:/ (外部配置) 运维: spring -jar s ...

  9. spark启动

    注意在启动spark时候要指定参数 要不就死启动的单机版的 /usr/local/spark-1.5.2-bin-hadoop2.6/bin/spark-shell \ --master spark: ...

  10. 使用logrotate做nginx日志分割

    版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=266 背景 nginx是一款非常优秀的网络代理工具,但是其日志管理有点缺憾:nginx的access_log会无 ...