交叉编译sqlcipher
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的更多相关文章
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- Ubuntu 16.04 安装 arm-linux-gcc 嵌入式交叉编译环境 问题汇总
闲扯: 实习了将近半年一直在做硬件以及底层的驱动,最近要找工作了发现了对linux普遍要求很高,而且工作岗位也非常多,所以最近一些时间在时不时地接触linux. 正文:(我一时兴起开始写博客,准备不充 ...
- Android数据存储之SQLCipher数据库加密
前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...
- Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1
交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...
- Linux主机上实现树莓派的交叉编译及文件传输,远程登陆
0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...
- FFmpeg和X264的交叉编译环境
在下载好了FFmpeg和X264的源码包之后,在Linux下进行安装的基本流程就是切换到其源码的根目录,然后以此执行以下命令.基本上所有的开源源码包的默认编译安装都是这三步. ./configure ...
- Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程)
Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程) 声明:本教程在参考了以下博文,并经过自己的摸索后实际操作得出,本教程系本人原创,由于升级 ...
- Ubuntu 树莓派2b交叉编译环境
在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时是因为目的平台 ...
- Ubuntu实现树莓派交叉编译
一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时 ...
随机推荐
- ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信
设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信,所以本章的主要内容就是讲解ESP8266 SPI和I2C总线 ...
- e.target与事件委托简例(原生和jQuery的区别)
target定义(英译:目标,目的): target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. 语法: event.target event.target.no ...
- 百万年薪python之路 -- 面向对象之三大特性
1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...
- 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(一)
MySQL的行(记录)的操作(一) 1. 增(insert) insert into 表名 value((字段1,字段2...); # 只能增加一行记录 insert into 表名 values(字 ...
- Excel接口导出,导入数据库(.Net)
public ActionResult TestExcel(string filePath) { return View(); } /// <summary> /// 根据Excel列类型 ...
- IDEA配置tomcat报错
昨晚想Eclipse转IDEA,谁知道在tomcat就卡住了,难受.今天一下就解决了,记录一下(没有保存错误信息的截图[/敲打]). 问题描述: 运行的时候tomcat卡在Deployment of ...
- UART和RS232/RS485的关系是什么?
串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...
- Spring Cloud gateway 三 自定义过滤器GatewayFilter
之前zuul 网关介绍.他有过滤器周期是四种,也是四种类型的过滤器.而gateway 只有俩种过滤器:"pre" 和 "post". PRE: 这种过滤器在请求 ...
- MIT线性代数:21.特征值和特征向量
- 查找一个卷对应的osd
1.首先找到卷的id: 2.使用rados命令找到卷上面的对象数据: 3.通过ceph osd map命令可以查询到对象对应的pgid及pg对应的osd: