如何正确构建 .a 文件 (KMM)
How to build a .a file correctly (KMM)
我们需要在不使用 Cocoapods 的情况下将 SQLCipher 包含在我们的 KMM 项目中。这涉及构建 libSQLCipher.a。
我可以使用这些命令在终端中执行此操作:
./configure --enable-tempstore=yes --with-crypto-lib=commoncrypto CFLAGS="
-DSQLITE_HAS_CODEC=1
-DSQLITE_TEMP_STORE=3
-DSQLCIPHER_CRYPTO_CC
-DSQLITE_SOUNDEX
-DSQLITE_THREADSAFE
-DSQLITE_ENABLE_RTREE
-DSQLITE_ENABLE_STAT3
-DSQLITE_ENABLE_STAT4
-DSQLITE_ENABLE_COLUMN_METADATA
-DSQLITE_ENABLE_MEMORY_MANAGEMENT
-DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_UNLOCK_NOTIFY
-DSQLITE_ENABLE_FTS3_PARENTHESIS
-DSQLITE_ENABLE_FTS4
-DSQLITE_ENABLE_FTS4_UNICODE61
-DSQLITE_ENABLE_JSON1
-DSQLITE_ENABLE_FTS5
-DHAVE_USLEEP=1
-DSQLITE_MAX_VARIABLE_NUMBER=99999"
LDFLAGS="/usr/local/Cellar/openssl@1.1 /1.1.1l_1/lib/libcrypto.a"
make sqlite3.c
`xcrun --sdk iphoneos --find clang` -x c -target arm64-apple-ios8.0 -isysroot `xcrun --sdk iphoneos --show-sdk-path` -fmodules -DSQLITE_HAS_CODEC=1 -fstrict-aliasing -fembed-bitcode-marker -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_SOUNDEX -DSQLITE_THREADSAFE -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_STAT3 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_MEMORY_MANAGEMENT -DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS4_UNICODE61 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLCIPHER_CRYPTO_CC -DHAVE_USLEEP=1 -DSQLITE_MAX_VARIABLE_NUMBER=99999 -DNDEBUG -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_SOUNDEX -DSQLITE_THREADSAFE -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_STAT3 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_MEMORY_MANAGEMENT -DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS4_UNICODE61 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLCIPHER_CRYPTO_CC -DHAVE_USLEEP=1 -DSQLITE_MAX_VARIABLE_NUMBER=99999 -fno-objc-arc -fmodule-name=SQLCipher -Oz -fno-common -c sqlite3.c -o sqlite3.o
`xcrun --sdk iphoneos --find libtool` -static -arch_only arm64 -syslibroot `xcrun --sdk iphoneos --show-sdk-path` -o libSQLCipher.a sqlite3.o
我将 libSQLCipher.a 放入 Android 工作室,并按照 KMM 网站上的说明进行设置,创建 .def 文件,link 向上,添加到 build.gradle 等。
我可以访问 sql3_open() 等方法,这很棒。
但是,我无法访问 sqlite3_key()、sqlite3_key_v2()、sqlite3_rekey()、sqlite3_rekey_v2()、sqlite3_activate_see().
我在 .h 文件中注意到,这些在此处:
/* BEGIN SQLCIPHER */
#ifdef SQLITE_HAS_CODEC
// sqlite3_key(), sqlite3_key_v2(), sqlite3_rekey(), sqlite3_rekey_v2(),
sqlite3_activate_see() methods are defined here
#endif
/* END SQLCIPHER */
SQLCipher 网站说要在构建配置中包含 SQLITE_HAS_CODEC,看起来我正在这样做。所以我真的不知道为什么我不能访问这些方法。
有点冗长的问题,但真的希望这里有人对此有一些建议。
谢谢!
Kotlin/Native 的 cinterop
工具应该明确指定所有编译器选项,以便“查看”header,就像您的编译器在构建库时所做的一样。要指定编译器选项,请使用 the documentation 中描述的 DSL。
一般来说,类似的东西应该可以工作:
...
kotlin {
iosArm64 { // Replace with a target you need.
compilations.getByName("main") {
val myInterop by cinterops.creating {
...
compilerOpts("-DSQLITE_HAS_CODEC=1")
...
}
}
}
...
我们需要在不使用 Cocoapods 的情况下将 SQLCipher 包含在我们的 KMM 项目中。这涉及构建 libSQLCipher.a。 我可以使用这些命令在终端中执行此操作:
./configure --enable-tempstore=yes --with-crypto-lib=commoncrypto CFLAGS="
-DSQLITE_HAS_CODEC=1
-DSQLITE_TEMP_STORE=3
-DSQLCIPHER_CRYPTO_CC
-DSQLITE_SOUNDEX
-DSQLITE_THREADSAFE
-DSQLITE_ENABLE_RTREE
-DSQLITE_ENABLE_STAT3
-DSQLITE_ENABLE_STAT4
-DSQLITE_ENABLE_COLUMN_METADATA
-DSQLITE_ENABLE_MEMORY_MANAGEMENT
-DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_UNLOCK_NOTIFY
-DSQLITE_ENABLE_FTS3_PARENTHESIS
-DSQLITE_ENABLE_FTS4
-DSQLITE_ENABLE_FTS4_UNICODE61
-DSQLITE_ENABLE_JSON1
-DSQLITE_ENABLE_FTS5
-DHAVE_USLEEP=1
-DSQLITE_MAX_VARIABLE_NUMBER=99999"
LDFLAGS="/usr/local/Cellar/openssl@1.1 /1.1.1l_1/lib/libcrypto.a"
make sqlite3.c
`xcrun --sdk iphoneos --find clang` -x c -target arm64-apple-ios8.0 -isysroot `xcrun --sdk iphoneos --show-sdk-path` -fmodules -DSQLITE_HAS_CODEC=1 -fstrict-aliasing -fembed-bitcode-marker -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_SOUNDEX -DSQLITE_THREADSAFE -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_STAT3 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_MEMORY_MANAGEMENT -DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS4_UNICODE61 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLCIPHER_CRYPTO_CC -DHAVE_USLEEP=1 -DSQLITE_MAX_VARIABLE_NUMBER=99999 -DNDEBUG -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_SOUNDEX -DSQLITE_THREADSAFE -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_STAT3 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_MEMORY_MANAGEMENT -DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS4_UNICODE61 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLCIPHER_CRYPTO_CC -DHAVE_USLEEP=1 -DSQLITE_MAX_VARIABLE_NUMBER=99999 -fno-objc-arc -fmodule-name=SQLCipher -Oz -fno-common -c sqlite3.c -o sqlite3.o
`xcrun --sdk iphoneos --find libtool` -static -arch_only arm64 -syslibroot `xcrun --sdk iphoneos --show-sdk-path` -o libSQLCipher.a sqlite3.o
我将 libSQLCipher.a 放入 Android 工作室,并按照 KMM 网站上的说明进行设置,创建 .def 文件,link 向上,添加到 build.gradle 等。 我可以访问 sql3_open() 等方法,这很棒。 但是,我无法访问 sqlite3_key()、sqlite3_key_v2()、sqlite3_rekey()、sqlite3_rekey_v2()、sqlite3_activate_see().
我在 .h 文件中注意到,这些在此处:
/* BEGIN SQLCIPHER */
#ifdef SQLITE_HAS_CODEC
// sqlite3_key(), sqlite3_key_v2(), sqlite3_rekey(), sqlite3_rekey_v2(),
sqlite3_activate_see() methods are defined here
#endif
/* END SQLCIPHER */
SQLCipher 网站说要在构建配置中包含 SQLITE_HAS_CODEC,看起来我正在这样做。所以我真的不知道为什么我不能访问这些方法。
有点冗长的问题,但真的希望这里有人对此有一些建议。 谢谢!
Kotlin/Native 的 cinterop
工具应该明确指定所有编译器选项,以便“查看”header,就像您的编译器在构建库时所做的一样。要指定编译器选项,请使用 the documentation 中描述的 DSL。
一般来说,类似的东西应该可以工作:
...
kotlin {
iosArm64 { // Replace with a target you need.
compilations.getByName("main") {
val myInterop by cinterops.creating {
...
compilerOpts("-DSQLITE_HAS_CODEC=1")
...
}
}
}
...