代码之家  ›  专栏  ›  技术社区  ›  jpo38

如何使用Windows使用NDK R18B为Android编译Boost 1.68.0

  •  0
  • jpo38  · 技术社区  · 5 年前

    我必须使用ndk R18b为Android构建一个Boost版本,我很难做到这一点,所以我在这里发布问题+答案,因为它可能会帮助其他人。

    首先,我试过 https://github.com/moritz-wundke/Boost-for-Android ,但这不成功,请参见 How to build boost 1.69.0 for Android with NDK r18b using moritz-wundke/Boost-for-Android? .

    第二,我试过 https://github.com/dec1/Boost-for-Android ,但这也不成功,请参见 How to build boost 1.69.0 for Android with NDK r18b using dec1/Boost-for-Android? .

    要实现Boost的编译,需要遵循哪些步骤?

    2 回复  |  直到 5 年前
        1
  •  1
  •   jpo38    5 年前

    实际上,这些脚本是为Linux设计的,它们几乎不能在Windows下工作。然后,我从头开始,终于可以在Windows下找到好的配置来实现这一点。我基本上检查了其他库是如何编译的(我使用qtcreator在Android上部署的,所以编译窗口报告了如何调用clang++的,所以我基于它编写了一个user-config.jam。

    以下是使用ndk R18b为Android Armeabiv7和x86编译Boost 1.68.0的步骤:

    然后设置一些环境变量:

    set ANDROIDNDKROOT=C:\Android\android-ndk-r18b (change this accordingly)
    set NDKVER=r18b
    set CLANGPATH=%ANDROIDNDKROOT%\toolchains\llvm\prebuilt\windows-x86_64\bin
    

    拷贝 user-config.jam 升压文件夹 tools/build/src :

    import os ;
    local AndroidNDKRoot = [ os.environ ANDROIDNDKROOT ] ;
    local AndroidBinariesPath = [ os.environ CLANGPATH ] ;
    
    using clang : armeabiv7a
    :
    $(AndroidBinariesPath)/clang++
    :
    <compileflags>-fexceptions
    <compileflags>-frtti
    <compileflags>-mthumb
    <compileflags>-ffunction-sections
    <compileflags>-funwind-tables
    <compileflags>-fstack-protector-strong
    <compileflags>-Wno-invalid-command-line-argument
    <compileflags>-Wno-unused-command-line-argument
    <compileflags>-no-canonical-prefixes
    <compileflags>-I$(AndroidNDKRoot)/sources/cxx-stl/llvm-libc++/include
    <compileflags>-I$(AndroidNDKRoot)/sources/cxx-stl/llvm-libc++abi/include
    <compileflags>-I$(AndroidNDKRoot)/sources/android/support/include
    <compileflags>-DANDROID
    <compileflags>-Wa,--noexecstack
    <compileflags>-Wformat
    <compileflags>-Werror=format-security
    <compileflags>-DNDEBUG
    <compileflags>-D_REENTRANT
    <compileflags>-O2
    <compileflags>-gcc-toolchain
    <compileflags>$(AndroidNDKRoot)/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
    <compileflags>-target
    <compileflags>armv7-linux-androideabi
    <compileflags>-march=armv7-a
    <compileflags>-mfloat-abi=softfp
    <compileflags>-mfpu=vfp
    <compileflags>-fno-builtin-memmove
    <compileflags>-fpic
    <compileflags>-DHAVE_CONFIG_H
    <compileflags>-fno-integrated-as
    <compileflags>--sysroot
    <compileflags>$(AndroidNDKRoot)/sysroot
    <compileflags>-isystem
    <compileflags>$(AndroidNDKRoot)/sysroot/usr/include/arm-linux-androideabi
    <compileflags>-D__ANDROID_API__=18
    <archiver>$(AndroidNDKRoot)/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/arm-linux-androideabi/bin/ar
    <ranlib>$(AndroidNDKRoot)/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/arm-linux-androideabi/bin/ranlib
    
    ;
    
    # --------------------------------------------------------------------
    
    using clang : x86
    :
    $(AndroidBinariesPath)/clang++
    :
    <compileflags>-fexceptions
    <compileflags>-frtti
    <compileflags>-mthumb
    <compileflags>-ffunction-sections
    <compileflags>-funwind-tables
    <compileflags>-fstack-protector-strong
    <compileflags>-Wno-invalid-command-line-argument
    <compileflags>-Wno-unused-command-line-argument
    <compileflags>-no-canonical-prefixes
    <compileflags>-I$(AndroidNDKRoot)/sources/cxx-stl/llvm-libc++/include
    <compileflags>-I$(AndroidNDKRoot)/sources/cxx-stl/llvm-libc++abi/include
    <compileflags>-I$(AndroidNDKRoot)/sources/android/support/include
    <compileflags>-DANDROID
    <compileflags>-Wa,--noexecstack
    <compileflags>-Wformat
    <compileflags>-Werror=format-security
    <compileflags>-DNDEBUG
    <compileflags>-D_REENTRANT
    <compileflags>-O2
    <compileflags>-gcc-toolchain
    <compileflags>$(AndroidNDKRoot)/toolchains/x86-4.9/prebuilt/windows-x86_64
    <compileflags>-target
    <compileflags>i686-linux-android
    <compileflags>-march=i686
    <compileflags>-mfloat-abi=softfp
    <compileflags>-mfpu=vfp
    <compileflags>-fno-builtin-memmove
    <compileflags>-fPIC
    <compileflags>-mstackrealign
    <compileflags>--sysroot
    <compileflags>$(AndroidNDKRoot)/sysroot
    <compileflags>-isystem
    <compileflags>$(AndroidNDKRoot)/sysroot/usr/include/i686-linux-android
    <compileflags>-D__ANDROID_API__=18
    <archiver>$(AndroidNDKRoot)/toolchains/x86-4.9/prebuilt/windows-x86_64/i686-linux-android/bin/ar
    <ranlib>$(AndroidNDKRoot)/toolchains/x86-4.9/prebuilt/windows-x86_64/i686-linux-android/bin/ranlib
    ;
    
    • 然后,对于ARMEABIV7-A:

      • bjam -q --without-math --without-context --without-coroutine --without-fiber --without-python architecture=arm --ignore-site-config -j4 target-os=android toolset=clang-armeabiv7a link=static threading=multi --layout=tagged --build-dir=build/arm/%NDKVER% --stagedir=stage_arm_%NDKVER% stage
    • 然后,对于x86:

      • bjam-q--不带数学--不带上下文--不带协程--不带光纤--不带python architecture=arm--忽略站点配置-j4 target os=android toolset=clang-armeabiv7a link=static threading=multi--layout=taged--build dir=build/arm/%ndkver%--stage dir=stage\arm\ndkver%stage

    希望编译1.69.0(未测试)也可以遵循相同的步骤。

        2
  •  1
  •   Declan    5 年前

    谢谢你的帮助。

    moritz-wundke/Boost-for-Android 是一个伟大的项目,也是Android的最初推动力。但是,在工作方式上,它需要持续的维护,以便在新版本出现时支持NDK和Boost的每个新组合(您只能为项目配置为支持的显式版本进行构建)。在很长一段时间之后(Boost版本1.53->1.63和NDK 10->16),项目似乎不再被维护,而我联系维护人员的努力徒劳无功,我决定放弃它,这就是为什么 dec1/Boost-for-Android 诞生了。

    它的优点是,一般来说,它不需要更新来支持谷歌新版本的NDK或Boost。它们通常都是现成的,或者需要很少的调整(但我仍然会定期测试以确保)。

    使用 DEC1/Boost Android版 也可以说更简单(当然比按照上面的说明)。您可以为任何/所有体系结构(arm64-v8a、armeabi-v7a、x86、x86_64)构建一行代码。如果您不需要自定义的构建,您可以从以下网站下载预构建的二进制文件(Boost1.69.0,使用ndk 19和18b,动态和静态都是可用的) here . 还有一个 example app 帮助您测试构建。

    我很确定它也可以在Windows或Mac上工作(可能比上面花费的精力要少),但是如果您真的想在Windows上开发,只使用虚拟机(例如免费的虚拟机)来进行构建和将生成的二进制文件复制到Windows上要容易得多。

    不过,MoritzWundke/BoostforAndroid最近似乎得到了新的贡献,这对每个人都是好消息。如果你觉得它更适合在Windows(或其他平台)上构建Boost,那就太好了。

    祝你的项目好运,再次感谢你的见解。