5

thisに従って、ブースト 1.5 を Android にインストールしようとしています。

コンパイルすると、エラーが発生します。コンパイル エラーの一部を次に示します。

gcc.compile.c++ bin.v2/libs/thread/build/gcc-android4.4.3/release/link-static/runtime-link-    static/threading-multi/pthread/thread.o
<command-line>: warning: "BOOST_FILESYSTEM_VERSION" redefined
<command-line>: warning: this is the location of the previous definition
In file included from ./boost/thread/thread.hpp:17,
             from libs/thread/src/pthread/thread.cpp:11:
./boost/thread/pthread/thread_data.hpp: In member function 'void    boost::thread_attributes::set_stack_size(size_t)':
./boost/thread/pthread/thread_data.hpp:42: error: 'PAGE_SIZE' was not declared in this scope

"../../toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -pedantic --sysroot=../../platforms/android-9/arch-arm -mthumb -Os -fno-strict-aliasing -O2 -DNDEBUG -g -lstdc++ -I../../sources/cxx-stl/gnu-libstdc++/include -I../../sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -D__GLIBC__ -DBOOST_NO_INTRINSIC_WCHAR_T -DBOOST_FILESYSTEM_VERSION=2 -pthread -Wextra -Wno-long-long -pedantic -DBOOST_ALL_NO_LIB=1 -DBOOST_CHRONO_STATIC_LINK=1 -DBOOST_FILESYSTEM_VERSION=3 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_SYSTEM_STATIC_LINK=1 -DBOOST_THREAD_BUILD_LIB=1 -DBOOST_THREAD_POSIX -DNDEBUG  -I"." -c -o "bin.v2/libs/thread/build/gcc-android4.4.3/release/link-static/runtime-link-static/threading-multi/pthread/thread.o" "libs/thread/src/pthread/thread.cpp"

...failed gcc.compile.c++ bin.v2/libs/thread/build/gcc-android4.4.3/release/link-static/runtime-link-static/threading-multi/pthread/thread.o...

私は理解していないこのエラーを見つけました...

./boost/thread/pthread/thread_data.hpp:42: error: 'PAGE_SIZE' was not declared in this scope. 宣言されていないと書かれていますPAGE_SIZEが、それが何を意味するのかわかりません。そして、コード内のその特定の場所を見ようとしたときに、見つかりませんでしPAGE_SIZEた。

4

2 に答える 2

7

1.50 ブースト、ndk-r8b でこの問題が発生しました。

このスレッドのおかげで、次の変更でなんとか修正できました。

ファイル boost/thread/thread.hpp

// Fix for missing macro
#define PAGE_SIZE sysconf(_SC_PAGESIZE)

#include <boost/thread/pthread/thread_data.hpp>

1.50 ブースト以降、これも変更する必要があることに注意してください。

ファイルブースト/ライブラリ/ファイルシステム/src/operations.cpp

# ifdef BOOST_POSIX_API

    const fs::path dot_path(".");
    const fs::path dot_dot_path("..");
#   include <sys/types.h>
#   include <sys/stat.h>
#   if !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(ANDROID)
#     include <sys/statvfs.h>
#     define BOOST_STATVFS statvfs
#     define BOOST_STATVFS_F_FRSIZE vfs.f_frsize
#   elif defined (ANDROID)
#     include <sys/vfs.h>
#     define BOOST_STATVFS statfs
#     define BOOST_STATVFS_F_FRSIZE static_cast<boost::uintmax_t>(vfs.f_bsize)
#   else
#     ifdef __OpenBSD__
#     include <sys/param.h>
#     endif
#     include <sys/mount.h>
#     define BOOST_STATVFS statfs
#     define BOOST_STATVFS_F_FRSIZE static_cast<boost::uintmax_t>(vfs.f_bsize)
#   endif
于 2012-09-27T14:24:51.247 に答える
4

このようなコンパイル エラーは通常、前処理された出力を最初に確認することで解決されます。to を(または別のものに)置き換えたり変更したりして、ファイルにエラーがないか確認してください-c(-Eを検索してください)。foo.ofoo.ppfoo.ppset_stack_size

これは関連するコードです:

        void set_stack_size(std::size_t size) BOOST_NOEXCEPT {
          if (size==0) return;
          std::size_t page_size = getpagesize();
#ifdef PTHREAD_STACK_MIN
          if (size<PTHREAD_STACK_MIN) size=PTHREAD_STACK_MIN;
#endif
          size = ((size+page_size-1)/page_size)*page_size;

getpagesize()を参照するものに展開されますPAGE_SIZEsysconf最近のページサイズを取得するための正しい方法 (tm) はかなり確信していますが、ブーストメンテナーにはgetpagesize(). -DPAGE_SIZE=2048とにかく、コンパイラの引数、またはターゲットのページサイズが何であれ、この特定のエラーを回避できます。それか、ソースにパッチを当ててsysconf(_SC_PAGESIZE)代わりに使用してください。

于 2012-07-12T02:37:08.397 に答える