1. 小心预编译宏SQLITE_HAS_CODEC

2. openssl在不同License下,导出的符号不对等。(错了,1.1.0后api发生变化,小心选用openssl版本)

3, ac使用了libtool,但sysroot却在链接时失效。

一如往常,所有GNU Make like的项目在linux平台下configure+make顺利编译安装,但交叉编译到android linux平台时,过程总是问题不断,要一个一个去手动解决。

1. 小心预编译宏SQLITE_HAS_CODEC

sqlcipher是sqlite3的加强版,提供加密。也就是sqlite3的修改版,里面修改添加了代码,并以一些预编译宏来进行分支选路。所有修改过的代码片段都包含在预编译宏SQLITE_HAS_CODEC保护下。如果你没有加入这个预编译宏SQLITE_HAS_CODEC,这部分代码就不会包含在源文件中。必须要清楚,这部分代码是修改,不是新添加。对于不包含新添加还晓幸编译出一个原版,但是不包含修改在代码,就连原本必要定义的结构或代码都不包含了,所以编译就会报错N多东西没有定义。而这些东西却在源文件文本中。

2. openssl在不同License下,导出的符号不对等。(错了,1.1.0后api发生变化)

在你的linux操作系统,你使用的openssl-devel包都在[GNU Public License]下,几乎所有依赖openssl的项目都可以很好地兼容编译。但是你要清楚,当你下载openssl代码包编译出来的库,却是[OpenSSL license]。这两个License有什么不同,就不深入了,但却影响我们的编译兼容。

左图是[OpenSSL License]下的hmac.h。(错了,不是License问题,这个是openssl 1.1.0f)

右图是[GNU Public License]下的hmac.h,也就是我们在linux操作系统常用的openssl-devel包。(错了,不是License问题,这个是openssl 1.0.1e)

在[GNU Public License]下的hmac.h中,结构体hmac_ctx_st导出到头文件。

而[OpenSSL License]下的hmac.h中, 结构体hmac_ctx_st却要隐藏定义,用户必须通过HMAC_CTX_new()来动态分配空间。

这有什么大影响呢?问题是一些项目在它们的结构体直接聚合hmac_ctx_st结构体,使得你编译这些项目时不兼容。

例如sqlcipher项目这样的代码段

这就让你闷,在[GNU Public License]的openssl包可以编译过,在[OpenSSL License]的openssl库就编译不过。

这个结构体的定义在

又要手动在这添加在那添加了。

evp_cipher_st: ./crypto/include/internal/evp_int.h (openssl 1.1.0之后版本)

hmac_ctx_st: ./crypto/hmac/hmac_lcl.h (openssl 1.1.0之后版本)

openssl 1.1.0之后HMAC_CTX_Init以及HMAC_cleanup函数没有了,如果你使用的第三方库依赖旧的openssl,就要小心选用版本。

openssl 1.1.0对android平台编译比较友好,也就容易编译。openssl 1.0.1之前进行android平台编译十分麻烦。并且有几个地方会闷死你。

1. 不同目录的源文件,包含同一项目其它目录的头文件,并没有指定项目目录的根点,用相对路径,而是一个直接#include "xxx.h",你必须根据每次编译错误去补全所有包含路径。crypto目录下的子目录的源文件随便依赖其它目录的头文件。所以你必须添加这个项目内多个目录到包含路径。

2. 编译参数AR,一般指定为host平台的ar程序路径,但是在这个项目中,AR=ar r,不要漏了后面的r,不然在make过程总报静态库链接命令语法错误。

3. 编译参数SHLIB_TARGET,你必须参考Makefile.shared去设置这个参数值,使你编译动态库时可以顺利完成。

3, ac使用了libtool,但sysroot却在链接时失效。 

ac会生成Makefile以及libtool,Makefile会去调用libtool。虽然你在LTCFLAGS中设置了--sysroot,并且Makefile的确也使用到libtool --mode=link命令中,但是最后执行gcc链接的命令中却找不到--sysroot选项,导致crtbegin.o, crtend.o路径错误。这里必须自己去手动修改libtool对应的生成动态库的命令(archive_cmds),加入--sysroot选项。手动修改ac生成的文件去编译,最不好就是不通用,下次再编译就记不起了,这与ac自动化相悖。

4. 尽量静态链接到你自己编译的openssl库

4.1 openssl在各厂商的android系统/system/lib都会带有,而你编译的一定不完全相同,但是动态加载时一定会加载到/system/lib目录里的openssl库,而不是你编译的。

4.2 如果你的程序依赖了__gnu_thumb1_case_XXXX函数,说明你的-fPIC选项默认在使用jump tables,如果编译不过请使用-fno-jump-tables去除。

交叉编译sqlcipher的更多相关文章

  1. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  2. Ubuntu 16.04 安装 arm-linux-gcc 嵌入式交叉编译环境 问题汇总

    闲扯: 实习了将近半年一直在做硬件以及底层的驱动,最近要找工作了发现了对linux普遍要求很高,而且工作岗位也非常多,所以最近一些时间在时不时地接触linux. 正文:(我一时兴起开始写博客,准备不充 ...

  3. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  4. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

  5. Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  6. FFmpeg和X264的交叉编译环境

    在下载好了FFmpeg和X264的源码包之后,在Linux下进行安装的基本流程就是切换到其源码的根目录,然后以此执行以下命令.基本上所有的开源源码包的默认编译安装都是这三步. ./configure ...

  7. Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程)

    Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程) 声明:本教程在参考了以下博文,并经过自己的摸索后实际操作得出,本教程系本人原创,由于升级 ...

  8. Ubuntu 树莓派2b交叉编译环境

    在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时是因为目的平台 ...

  9. Ubuntu实现树莓派交叉编译

    一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时 ...

随机推荐

  1. ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信

        设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信,所以本章的主要内容就是讲解ESP8266 SPI和I2C总线 ...

  2. e.target与事件委托简例(原生和jQuery的区别)

    target定义(英译:目标,目的): target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. 语法: event.target event.target.no ...

  3. 百万年薪python之路 -- 面向对象之三大特性

    1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...

  4. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(一)

    MySQL的行(记录)的操作(一) 1. 增(insert) insert into 表名 value((字段1,字段2...); # 只能增加一行记录 insert into 表名 values(字 ...

  5. Excel接口导出,导入数据库(.Net)

    public ActionResult TestExcel(string filePath) { return View(); } /// <summary> /// 根据Excel列类型 ...

  6. IDEA配置tomcat报错

    昨晚想Eclipse转IDEA,谁知道在tomcat就卡住了,难受.今天一下就解决了,记录一下(没有保存错误信息的截图[/敲打]). 问题描述: 运行的时候tomcat卡在Deployment of ...

  7. UART和RS232/RS485的关系是什么?

    串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...

  8. Spring Cloud gateway 三 自定义过滤器GatewayFilter

    之前zuul 网关介绍.他有过滤器周期是四种,也是四种类型的过滤器.而gateway 只有俩种过滤器:"pre" 和 "post". PRE: 这种过滤器在请求 ...

  9. MIT线性代数:21.特征值和特征向量

  10. 查找一个卷对应的osd

    1.首先找到卷的id: 2.使用rados命令找到卷上面的对象数据: 3.通过ceph osd map命令可以查询到对象对应的pgid及pg对应的osd: