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. django报错问题解决

    注意以下修改文件均是修改虚拟python环境中的文件 1.执行(venv) E:\myproj\autotest>python manage.py makemigrations报错: 解决办法: ...

  2. 冷知识: 不会出现OutOfMemoryError的内存区域

    程序计数器(PC) 因为程序计数器只是记录当前线程正在执行的那条字节码指令的地址,即使出现死循环都不会内存溢出

  3. 网络数据请求request

    关于网络数据请求的类很多,httpwebrequest,webrequest,webclient以及httpclient,具体差别在此不在赘述,在应用方面介绍webclient与httpclient则 ...

  4. mysql中的锁机制之悲观锁和乐观锁

    1.悲观锁? 悲观锁顾名思义就是很悲观,悲观锁认为数据随时就有可能会被外界进行修改,所以悲观锁一上来就会把数据给加上锁.悲观锁一般都是依靠关系型数据库提供的锁机制,然而事实上关系型数据库中的行锁,表锁 ...

  5. 学习笔记36_Razor

    *Razor视图引擎 在添加视图的时候,视图引擎除了有“aspx”外,还有Razor(CSHTML),就会在对应的文件夹下,产生 view.cshtml文件,那么,以后写C#代码,就可以 @for(v ...

  6. vps配置脚本备个份

    #!/bin/bash apt-get update -y apt-get dist-upgrade -y apt-get install -y nmap vim build-essential gc ...

  7. 敏捷宣言(Agile Manifesto)和敏捷开发十二原则

    敏捷宣言 The Agile Manifesto Individuals and interactions over Process and tools 个体与交互 重于 过程和工具 Working ...

  8. NOIP模拟 16

    嗯我已经是个不折不扣的大辣鸡了 上次的T3就弃了,这次又弃 颓废到天际 T1 巨贪贪心算法 我就是一个只会背板子的大辣鸡 全裸的贪心看不出来,只会打板子 打板子,加特判,然后一无进展,原题不会,这就是 ...

  9. python私有变量的分类

  10. NOIP的模板--考前复习

    距离NOIP还有25天 可以去放弃一些巨难得题目去搞一些模板了 -------在校老师的原话 一·快排 虽然可以手打,最好用STL,里面有很多优化,会快很多 #include<iostream& ...