web-dev-qa-db-ja.com

Androidをc ++ 11をサポートする共有ライブラリとしてブーストを構築する方法

Android、c ++ 11をサポート)のboost_1.60.0(共有ライブラリとして)をビルドしようとしています。最新のndk(現在はAndroid-ndk-r10e)を使用しています。ビルドホストはウインドウズ10。

これは非オープンソースプロジェクト用です。私が理解している限り、gnustl_sharedは使用できず、c ++ _sharedをAndroid c ++ランタイムとして使用する必要があります。

私のproject-config.jamは次のようになります。

androidNDKRoot = c:/Android-ndk-r10e ;
 using gcc : Android :
     $(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ :
      <root>$(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/
      <compileflags>-MMD
      <compileflags>-MP
      <compileflags>-MF
      <compileflags>-fpic 
      <compileflags>-ffunction-sections 
      <compileflags>-funwind-tables 
      <compileflags>-fstack-protector 
      <compileflags>-no-canonical-prefixes 
      <compileflags>-march=armv5te 
      <compileflags>-mtune=xscale 
      <compileflags>-msoft-float 
      <compileflags>-fno-rtti 
      <compileflags>-mthumb 
      <compileflags>-Os 
      <compileflags>-g 
      <compileflags>-DNDEBUG 
      <compileflags>-fomit-frame-pointer 
      <compileflags>-fno-strict-aliasing 
      <compileflags>-finline-limit=64
      <compileflags>-IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/libcxx/include
      <compileflags>-IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../llvm-libc++abi/libcxxabi/include
      <compileflags>-IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../../Android/support/include
      <compileflags>-IC:/Android-ndk-r10e/platforms/Android-9/Arch-arm/usr/include
      <compileflags>-Wa,--noexecstack 
      <compileflags>-Wformat 
      <compileflags>-Werror=format-security
      <compileflags>-DUNIX 
      <compileflags>-DANDROID 
      <compileflags>-Wl,--no-undefined
      <cxxflags>-fexceptions 
      <linkflags>-lc++_shared
      <archiver>$(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-ar
      <ranlib>$(androidNDKRoot)/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-ranlib
        ;        

ビルドコマンドは次のとおりです。

b2 --toolset=gcc-Android cxxflags="-std=c++11 " --prefix=..\boost_Android_arm --builddir=./boost_Android_arm/builddir target-os=linux --with-filesystem define=BOOST_FILESYSTEM_VERSION=3 link=shared runtime-link=shared threading=multi 

Project-config.jamのパラメーターを決定するために、ndk-buildを使用してサンプル共有ライブラリをビルドし、そのデバッグメッセージを取得して、使用するコンパイルコマンドとリンクコマンドを抽出しました。

コンパイル:

C:\Android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-g++.exe,C:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/someLib/./Unity1.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/../../library/../../../../ -Ijni/../../library/../../../../src/ -IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/libcxx/include -IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../llvm-libc++abi/libcxxabi/include -IC:/Android-ndk-r10e/sources/cxx-stl/llvm-libc++/../../Android/support/include -Ijni/../../library -DANDROID -DHAVE_CONFIG_H -DSESTEK_Android_XERCES_HACK -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -fno-strict-aliasing -frtti -fexceptions -DUNIX -DANDROID -IC:/Android-ndk-r10e/platforms/Android-9/Arch-arm/usr/include -c jni/../../library/./Unity1.cpp -o ./obj/local/armeabi/objs/someLib/./Unity1.o,...)

リンク:

C:\Android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-g++.exe,C:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libsomeLib.so -shared --sysroot=C:/Android-ndk-r10e/platforms/Android-9/Arch-arm ./obj/local/armeabi/objs/someLib/./Unity1.o -lgcc ./obj/local/armeabi/libc++_shared.so -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -mthumb -lc -lm -o ./obj/local/armeabi/libsomeLib.so,...)

簡潔にするために、このトライアル用のファイルシステムのみをビルドしましたが、最終的には、少なくともスレッド、ファイルシステム、date_time、asio、およびログライブラリをビルドする予定です。
最後に、私が得るエラーは次のとおりです。

...patience...
...found 660 targets...
...updating 13 targets...
gcc.compile.c++ bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o
gcc.link.dll bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\libboost_system-gcc-mt-1_60.so.1.60.0
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot open crtbegin_so.o: No such file or directory
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lrt
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot open crtend_so.o: No such file or directory
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lc++_shared
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lstdc++
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lm
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lc
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -ldl
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lc
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
    ./boost/system/detail/error_code.ipp:458: error: undefined reference to '__dso_handle'
    ./boost/system/detail/error_code.ipp:464: error: undefined reference to '__dso_handle'
    ./boost/system/detail/error_code.ipp:158: error: undefined reference to '__dso_handle'
collect2.exe: error: ld returned 1 exit status
    "c:/Android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++"    -o "bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\libboost_system-gcc-mt-1_60.so.1.60.0"  -shared -Wl,--start-group "bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\error_code.o"  -Wl,-Bstatic  -Wl,-Bdynamic -lrt -Wl,--end-group -lc++_shared -pthread
...failed gcc.link.dll bin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi\libboost_system-gcc-mt-1_60.so.1.60.0...
...skipped <pstage\lib>libboost_system-gcc-mt-1_60.so.1.60.0 for lack of <pbin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi>libboost_system-gcc-mt-1_60.so.1.60.0...
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\codecvt_error_category.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\operations.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\path.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\path_traits.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\portability.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\unique_path.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\utf8_codecvt_facet.o
gcc.compile.c++ bin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi\windows_file_codecvt.o
...skipped <pbin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi>libboost_filesystem-gcc-mt-1_60.so.1.60.0 for lack of <pbin.v2\libs\system\build\gcc-Android\release\target-os-linux\threading-multi>libboost_system-gcc-mt-1_60.so.1.60.0...
...skipped <pstage\lib>libboost_filesystem-gcc-mt-1_60.so.1.60.0 for lack of <pbin.v2\libs\filesystem\build\gcc-Android\release\target-os-linux\threading-multi>libboost_filesystem-gcc-mt-1_60.so.1.60.0...
...failed updating 1 target...
...skipped 3 targets...
...updated 9 targets...

エラーは、必要なライブラリを見つけるためにディレクトリが必要であることを示していますが、問題はAndroid ndkの下にrtやcrtbegin_so.oなどの名前のファイルがいくつかあることです。私はする必要があると思いますコンパイラに正しいディレクトリ自体を決定させます。

私が実際に必要としているのは、Android、c ++ 11をサポート)のブースト共有ライブラリをビルドすることです。したがって、上記のビルドを使用して正しい方向に向けることで、あなたの助けを受け入れることができます。パラメータまたは作業サンプルを提供して、詳細を自分で計算できるようにします。

また、もう1つ、ビルドコマンドでlink=staticの代わりにlink=sharedを使用すると、ビルドが成功します。しかし、私は作成された静的ライブラリを試していません。

16
Mert

NDKを使用してLinuxでBoostを構築する

あなたがWindowsについて質問していることは知っていますが、macOSでこれを実行したかったのですが、ほぼ正確なエラーで失敗しました。私はついに故障し、自分の linodeサーバー で問題なく動作しました。これは、彼らが他のプラットフォームをテストするのに本当に良い仕事をしていないことを私に言います。 macOSでのみ静的コンパイルは、Windowsでも発見したように機能します。

基準点

  • NDK R13
  • ブースト1.62.0
  • Clang ++でテスト済み。 g ++も機能します

なぜclangを使用しているのか疑問に思われる場合は、リリースノートに次のメッセージがあります。

GCCはサポートされなくなりました。まだNDKから削除されませんが、バックポートを受信しなくなります。 gnustlの一部はまだClangと互換性がないため、libc ++がデフォルトになるほど安定するまで削除できません。その後、削除される可能性があります。

user-config.jam

このファイルをホームディレクトリに配置しました。うん。

androidNDKRoot = /path/to/ndk-R13-standalone ;

using clang : Android
:
$(androidNDKRoot)/bin/arm-linux-androideabi-clang++
:
;

ライブラリのバージョン管理を回避するためにブーストでlibtool.m4を変更する

ブーストソースのlibtool.m4の下のtools/build/src/engine/boehm_gc/libtool.m4はAndroid)を参照していないため、セクションversion_type=linuxlinux*)を次のように変更する必要があります。 version_type=none。これにより、出力のバージョン管理された共有ライブラリにリンクされている末尾にバージョン番号が追加されていないシンボリックリンクが表示されます。

建物

共有リンクが失敗する原因となる-lrtフラグが渡されないようにするには、ターゲットOSをAndroidにする必要があります。

./b2 \
   -d+2 \
   -j 4 \
   --reconfigure \
   target-os=Android \
   toolset=clang-Android \
   include=${Android_NDK_STANDALONE}/include/c++/4.9.x \
   link=static,shared \
   variant=debug,release \
   threading=multi \
   --layout=versioned \
   --prefix=${BOOST_INSTALL_DIR} \
   install

関連情報はここにあります( Boost for Android )、共有ライブラリを正常に構築できましたが、結果のファイルにはAndroidができるバージョンサフィックスが付いているようです処理しません。また、ファイル名がハードコードされているため、バイナリの名前を変更することはできません。前回の投稿によると、1つの方法は、ファイルのlinuxセクションで変数version_typeをnone(version_type = none)に設定することです。あなたの場合、ビルドのセットアップは少し異なるかもしれませんが、その議論で彼らが行った変更を見てみる価値があるかもしれません。

3
Joy Patra

ここで: http://silverglint.com/boost-for-Android/ Android用の最新(例:1.67.0)バージョンのブーストを構築するためのシンプルで痛みのない新しい方法を見つけることができます。

このように構築されたブーストバイナリの使用方法を示すサンプルアプリも含まれています。

または、ビルド済みのバイナリをダウンロードすることもできます

0
Declan