无法在 Windows 上为 Android 构建 Botan

Unable to build Botan for Android on Windows

根据说明 here:

,我无法理解如何为 android 构建 Botan

$ export CXX=/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang++

$ ./configure.py --os=android --cc=clang --cpu=arm64

我不明白如何在 Windows 上使用这个命令,而且阅读以前的问题对我没有帮助,你能告诉我你是如何一步一步地在 windows 上构建这个库的吗, 只是你的命令示例?

我用了--cc-bin选项configure.py来指定编译器的路径,算是windows 的解决方案,但我拥有的是:

D:\Programming\Libraries\botanAndroid\botan-master>python configure.py --cc-bin=D:\Android\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi28-clang++ --os=android --cc=clang --cpu=armv7
INFO: configure.py invoked with options "--cc-bin=D:\Android\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi28-clang++ --os=android --cc=clang --cpu=armv7"
INFO: Configuring to build Botan 2.14.0 (revision unknown)
INFO: Running under 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)]
INFO: Autodetected platform information: OS="Windows" machine="AMD64" proc="Intel64 Family 6 Model 142 Stepping 10, GenuineIntel"
INFO: Canonicalized CPU target armv7 to arm32
WARNING: Could not execute ['D:\Android\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi28-clang++', '-E', 'src\build-data\detect_version.cpp']: [WinError 193] %1 is not an application of Win32
WARNING: Tried to get clang version, but output '0.0' does not match expected version format
WARNING: Could not execute ['D:\Android\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi28-clang++', '-E', '-fstack-protector', '-pthread', 'src\build-data\detect_arch.cpp']: [WinError 193] %1 is not an application of Win32
WARNING: Unable to detect target architecture via compiler macro checks
INFO: Target is clang:0.0-android-arm32
INFO: Assuming target arm32 is little endian
INFO: Skipping (dependency failure): asio certstor_sqlite3 rdrand sessions_sqlite3
INFO: Skipping (incompatible CPU): aes_armv8 aes_ni aes_power8 chacha_avx2 clmul_cpu clmul_ssse3 idea_sse2 p9_darn rdrand_rng rdseed serpent_avx2 sha1_armv8 sha1_sse2 sha1_x86 sha2_32_armv8 sha2_32_bmi2 sha2_32_x86 sha2_64_bmi2 sha3_bmi2 shacal2_avx2 shacal2_x86 simd_avx2 sm4_armv8 threefish_512_avx2
INFO: Skipping (incompatible OS): certstor_system_macos certstor_system_windows commoncrypto getentropy proc_walk win32_stats
INFO: Skipping (no enabled compression schemes): compression
INFO: Skipping (requires external dependency): boost bzip2 lzma openssl sqlite3 tpm zlib
INFO: Loading modules: adler32 aead aes aes_vperm aont argon2 aria asn1 auto_rng base base32 base58 base64 bcrypt bcrypt_pbkdf bigint blake2 block blowfish camellia cascade cast128 cast256 cbc cbc_mac ccm cecpq1 certstor_flatfile certstor_sql certstor_system cfb chacha chacha20poly1305 chacha_rng chacha_simd32 checksum cmac comb4p cpuid crc24 crc32 cryptobox ctr curve25519 des dev_random dh dl_algo dl_group dlies dsa dyn_load eax ec_group ecc_key ecdh ecdsa ecgdsa ecies eckcdsa ed25519 elgamal eme_oaep eme_pkcs1 eme_raw emsa1 emsa_pkcs1 emsa_pssr emsa_raw emsa_x931 entropy fd_unix ffi filters fpe_fe1 gcm gmac gost_28147 gost_3410 gost_3411 hash hash_id hex hkdf hmac hmac_drbg hotp http_util idea iso9796 kasumi kdf kdf1 kdf1_iso18033 kdf2 keccak keypair lion locking_allocator mac mce mceies md4 md5 mdx_hash mem_pool mgf1 misty1 mode_pad modes mp newhope nist_keywrap noekeon noekeon_simd numbertheory ocb ofb par_hash passhash9 pbes2 pbkdf pbkdf1 pbkdf2 pem pgp_s2k pk_pad pkcs11 poly1305 poly_dbl prf_tls prf_x942 psk_db pubkey rc4 rfc3394 rfc6979 rmd160 rng roughtime rsa salsa20 scrypt seed serpent serpent_simd sessions_sql sha1 sha2_32 sha2_64 sha3 shacal2 shacal2_simd shake shake_cipher simd siphash siv skein sm2 sm3 sm4 socket sodium sp800_108 sp800_56a sp800_56c srp6 stateful_rng stream streebog system_rng thread_utils threefish_512 tiger tls tls_10 tls_cbc tss twofish utils uuid whirlpool x509 x919_mac xmss xtea xts
INFO: Using hardlink to link files into build dir (use --link-method to change)
INFO: Botan 2.14.0 (revision unknown) (unreleased undated) build setup is complete

现在我正在使用 VisualStudio 2017 本机工具命令提示符,或调用 vcvarsall.bat 来设置环境。

似乎 Botan 对在 Windows 主机上构建 Android 二进制文件的支持是有限的。你将不得不使用黑魔法来完成这项工作。

构建过程包括两个阶段,即配置阶段和制作阶段。

您 link 编辑的文档中的 Android 特定说明不涵盖整个构建过程,仅涵盖配置阶段。对于 make 阶段,您必须遵循 Windows-specific instructions (link).

配置阶段:

您将需要以下二进制文件,调整您机器的路径:

  • clang++(注意最后的.cmd):C:\Development\android-ndk-r19c-windows-x86_64\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi28-clang++.cmd

  • ar: C:\Development\android-ndk-r19c-windows-x86_64\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ar.exe

在Botan文件夹中,运行configure命令:

python.exe .\configure.py --cc-bin=C:\Development\android-ndk-r19c-windows-x86_64\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi28-clang++.cmd --ar-command=C:\Development\android-ndk-r19c-windows-x86_64\android-ndk-r19c\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ar.exe --os=android --cpu=armv7 --verbose

制作相

配置阶段在 Botan 文件夹中生成一个 Makefile。您必须对此文件进行一些调整:

  • 在行 all: libs cli tests docs 中删除 docs

    原因:构建文档文件需要额外的工具。如果你真的需要文档,你也可以尝试安装这些工具,但我没有测试过。

  • 将出现的 ln -fs 替换为 copy

    原因:在 Linux ln -fs 上会创建一个从参数列表中的第二个文件到第一个文件的符号 link。此命令不可用,因此将其更改为将第一个文件复制到第二个文件对我来说似乎是一种务实的解决方法。您也可以将其更改为在 Windows 上创建 link 的适当命令,但在部署到 Android 目标时可能需要再次调整它。

  • 在以 LIBOBJS =CLIOBJS =TESTOBJS = 开头的行中,将所有出现的 \ 替换为 /。在整个文件中,将出现的 .\ 替换为 ./。原因:使用Windows风格的路径分隔符\似乎在某些地方会引起问题。

  • 找到 # Executable targets# Library targets 的方块。在参数列表周围插入 @<< ... <<(称为 nmake 内联文件功能,基于 this 答案),使其看起来像这样:

# Executable targets
$(CLI): $(LIBRARIES) $(CLIOBJS)
  $(EXE_LINK_CMD) @<<
$(ABI_FLAGS) $(CLIOBJS) $(EXE_LINKS_TO) $(LDFLAGS) -o $@
<<

$(TEST): $(LIBRARIES) $(TESTOBJS)
  $(EXE_LINK_CMD) @<<
$(ABI_FLAGS) $(TESTOBJS) $(EXE_LINKS_TO) $(LDFLAGS) -o $@
<<

# Library targets
./libbotan-2.a: $(LIBOBJS)
  $(AR) @<<
$(AR_OPTIONS) $@ $(LIBOBJS)
<<

./libbotan-2.so.13: $(LIBOBJS)
  $(CXX) @<<
-shared -fPIC -Wl,-soname,libbotan-2.so.13  $(ABI_FLAGS) $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) -o $@
<<

原因:没有这个改变,我得到一个关于参数列表太长的错误。

您将需要 nmake(Visual Studio 的一部分)。在我的机器上,它安装在 C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.25.28610\bin\Hostx64\x64\nmake.exe

在 Botan 文件夹中,运行 nmake.exe。之后,您的 Botan 文件夹应该包含二进制文件 botanbotan-test 和库 libbotan-2....