1. 程式人生 > >交叉編譯sqlcipher

交叉編譯sqlcipher

項目 分代 什麽 sqlit 所有 依賴 代碼包 代碼片段 linux平臺

1. 小心預編譯宏SQLITE_HAS_CODEC

2. openssl在不同License下,導出的符號不對等。

一如往常,所有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下,導出的符號不對等。

在你的linux操作系統,你使用的openssl-devel包都在[GNU Public License]下,幾乎所有依賴openssl的項目都可以很好地兼容編譯。但是你要清楚,當你下載openssl代碼包編譯出來的庫,卻是[OpenSSL license]。這兩個License有什麽不同,就不深入了,但卻影響我們的編譯兼容。

技術分享

左圖是[OpenSSL License]下的hmac.h

右圖是[GNU Public License]下的hmac.h,也就是我們在linux操作系統常用的openssl-devel包。

在[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庫就編譯不過。

技術分享

這個結構體的定義在

技術分享

又要手動在這添加在那添加了。

交叉編譯sqlcipher