Externals  Version: 0.1.4 Revision: 541 Platform: x86 Build: 14:26 02.05.2020
Решение для сборки сторонних библиотек
Boost

Сайт библиотеки

Версия Резюме
1.64.0 При сборке под Android при использовании в настройках слова gcc b2.exe зависает (использовать слово clang даже при сборке при помощи gcc)
1.67.0 Утечка памяти в Boost.Serialization
1.71.0 -
1.73.0 -

Сборка для Windows

Построение всех возможных вариантов (все библиотеки, Release|Debug, x86|x64):

bootstrap.bat
b2.exe

Построение только нужных библиотек:

bootstrap.bat
b2.exe --build-type=minimal msvc stage --with-filesystem

Построение для конкретной версии Visual Studio:

// Для VS2008
bootstrap.bat vc9
b2.exe toolset=msvc-9.0

Конфликт в DLL, построенной на базе MFC

Проявляется как assert'ы в файлах dllinit.cpp и dllmodul.cpp при загрузке DLL.

Для решения проблемы, закомментировать в файле ./libs/thread/src/win32/tss_pe.cpp строку

// extern BOOL (WINAPI * const _pRawDllMain)(HANDLE, DWORD, LPVOID)=&dll_callback;

и пересобрать lib'ы. Также нужно будет при выгрузке dll вызвать

#include <boost/thread/detail/tss_hooks.hpp>
on_process_exit();

Сборка для Android

Описание сборки на Windows

Скрипт сборки

Готовые сборки

Сборка при помощи clang 5.0

Заметки
Сборка производилась:
  • 28.04.2020.
  • android-ndk-r16b.
  • Boost 1.73.

Сборка:

  • В папке $(BoostRoot) запустить bootstrap.bat (будет построен файл b2.exe).
  • В папке $(BoostRoot) создать файл с именем user-config.jam, содержащий
import os ;
local AndroidNDKRoot = [ os.environ ANDROID_NDK_ROOT ] ;
local AndroidBinariesPath = [ os.environ CLANG_PATH ] ;
local AndroidApi = [ os.environ ANDROID_API ] ;
using clang : arm : $(AndroidBinariesPath)/clang++ :
<compileflags>-DNDEBUG
<compileflags>-DANDROID
<compileflags>-D__ANDROID__
<compileflags>-D__ANDROID_API__=$(AndroidApi)
<compileflags>-DHAVE_CONFIG_H
<compileflags>-DBOOST_FILESYSTEM_VERSION=3
<compileflags>--sysroot=$(AndroidNDKRoot)/sysroot
<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>-I$(AndroidNDKRoot)/sysroot/usr/include
<compileflags>-I$(AndroidNDKRoot)/sysroot/usr/include/arm-linux-androideabi
<compileflags>-std=c++14
<compileflags>-fstack-protector
<compileflags>-g0
<compileflags>-O3
<compileflags>-frtti
<compileflags>-fexceptions
<compileflags>-target
<compileflags>armv7-linux-androideabi
<compileflags>-march=armv7-a
<architecture>arm
<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 : arm64 : $(AndroidBinariesPath)/clang++ :
<compileflags>-DNDEBUG
<compileflags>-DANDROID
<compileflags>-D__ANDROID__
<compileflags>-D__ANDROID_API__=$(AndroidApi)
<compileflags>-DHAVE_CONFIG_H
<compileflags>-DBOOST_FILESYSTEM_VERSION=3
<compileflags>--sysroot=$(AndroidNDKRoot)/sysroot
<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>-I$(AndroidNDKRoot)/sysroot/usr/include
<compileflags>-I$(AndroidNDKRoot)/sysroot/usr/include/aarch64-linux-android
<compileflags>-std=c++14
<compileflags>-fstack-protector
<compileflags>-g0
<compileflags>-O3
<compileflags>-frtti
<compileflags>-fexceptions
<compileflags>-target
<compileflags>aarch64-none-linux-android
<compileflags>-march=armv8-a
<architecture>arm
<archiver>$(AndroidNDKRoot)/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/aarch64-linux-android/bin/ar
<ranlib>$(AndroidNDKRoot)/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/aarch64-linux-android/bin/ranlib
;
  • В папке $(BoostRoot) создать и запустить на исполнение файл BuildAndroid.cmd (при необходимости изменить путь к ANDROID_NDK и ANDROID_API)
@echo off
rem ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BUILD ARM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set ANDROID_NDK_ROOT=C:\Microsoft\AndroidNDK64\android-ndk-r16b
set ANDROID_API=19
set CLANG_PATH=%ANDROID_NDK_ROOT%\toolchains\llvm\prebuilt\windows-x86_64\bin
set ANDROID_TOOLCHAIN=%ANDROID_NDK_ROOT%\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\arm-linux-androideabi\bin
set PATH=%PATH%;%ANDROID_TOOLCHAIN%;
rd /S /Q .\android
rd /S /Q .\bin.v2
b2 target-os=android toolset=clang-arm link=static runtime-link=static ^
--layout=tagged --stagedir=android --ignore-site-config -j4 -q ^
--user-config=./user-config.jam ^
--with-date_time --with-filesystem --with-chrono --with-thread ^
threading=multi threadapi=pthread
cd ./android/lib
for %%i in (*.a) do (
ar -x %%i
)
for %%i in (*.o) do (
ar -cr libboost.a %%i
)
del *.o
pause
@echo off
rem ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BUILD ARM64 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set ANDROID_NDK_ROOT=C:\Microsoft\AndroidNDK64\android-ndk-r16b
set ANDROID_API=21
set CLANG_PATH=%ANDROID_NDK_ROOT%\toolchains\llvm\prebuilt\windows-x86_64\bin
set ANDROID_TOOLCHAIN=%ANDROID_NDK_ROOT%\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\aarch64-linux-android\bin
set PATH=%PATH%;%ANDROID_TOOLCHAIN%;
rd /S /Q .\android
rd /S /Q .\bin.v2
b2 target-os=android toolset=clang-arm64 link=static runtime-link=static ^
address-model=64 architecture=arm abi=aapcs ^
--layout=tagged --stagedir=android --ignore-site-config -j4 -q ^
--user-config=./user-config.jam ^
--with-date_time --with-filesystem --with-chrono --with-thread ^
threading=multi threadapi=pthread
cd ./android/lib
for %%i in (*.a) do (
ar -x %%i
)
for %%i in (*.o) do (
ar -cr libboost.a %%i
)
del *.o
pause
  • Результатом построения будет общий файл libboost.a в папке $(BoostRoot)/android/lib.