交叉编译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实现树莓派交叉编译
一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时 ...
随机推荐
- SpringCloud之RefreshScope 源码解读
SpringCloud之RefreshScope @Scope 源码解读 Scope(org.springframework.beans.factory.config.Scope)是Spring 2. ...
- 02jmeter-函数助手使用
示例:__Random函数 1.打开函数助手,并按提示写入value 2.引用.复制出${__Random(1,99,gp)}放到需要引用的地方 3.请求成功后可通过debug sampler查看变量 ...
- 3.如何理解开多线程可以充分利用CPU?
如何理解开多线程可以充分利用CPU? <1>操作系统采用时间片轮转调度算法分配的时间片给每个进程中的线程 <2>操作系统的时间片轮转调度算法分配的时间片 在别的进程中都没有准备 ...
- 简单认识JVM
准备: 在具体聊JVM之前,我们先看两张图,通过分析图,咱们慢慢来聊聊JVM. JVM内存结构图 JVM内存结构脑图 上面两张图中,第二张图相对来说比较直观,就是JVM内存结构都划分成了哪些模块,各个 ...
- 百万年薪python之路 -- MySQL数据库之 用户权限
MySQL用户授权 (来自于https://www.cnblogs.com/dong-/p/9667787.html) 一. 对新用户的增删改 1. 增加用户 : ①. 指定某一个用户使用某一个ip登 ...
- SpringBoot学习(三)探究Springboot自动装配
目录 什么是自动装配 何时自动装配 原理分析 注:以下展示的代码springboot的版本为2.0.3版.因源码过长,大家选择展开代码 ㄟ( ▔, ▔ )ㄏ 什么是自动装配 自动装配还是利用了Spri ...
- 面试题-javascript-面向对象编程
笔者在某次笔试中遇到这个题:印象很深. function ClassA() { var value=4; this.getValue= function() { return value; } thi ...
- Redis(七)Redis的噩梦:阻塞
为什么说阻塞是Redis的噩梦: Redis是典型的单线程架构,所有的读写操作都是在一条主线程中完成的.当Redis用于高并发场景时,这条线程就变成了它的生命线.如果出现阻塞,哪怕是很短时间,对于应用 ...
- fenby C语言 P20
循环停止 break 立刻跳出不再循环 continue立刻跳出循环从下一次循环继续执行 #include <stdio.h> int main(){ int i; for(i=1;i&l ...
- (23)ASP.NET Core EF关系数据库建模
1.简介 一般而言,本部分中的配置适用于关系数据库.安装关系数据库提供程序时,此处显示的变为可用扩展方法(原因在于共享的Microsoft.EntityFrameworkCore.Relational ...