Android NDK r12を見ると、platforms/android- {API level}/{arch}/usr/include/sysのヘッダファイルに違いがあることがわかります。 APIレベル19およびそれ以下では、ファイルexec_elf.hは存在しますが、それ以降は削除されたようです。そこのファイルが追加または削除された他の多数の相違点がありますが、それは特定のマクロを定義するので、私はexec_elf.hに興味がある:exec_elf.hがAndroid NDKから削除されたのはなぜですか?
#define ELF64_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf))
このマクロは、ICUのソースで使用されている、と私のクロス
arm-linux-androideabi-clang ... icu/source/tools/toolutil/pkg_genc.c
icu/source/tools/toolutil/pkg_genc.c:869:13: warning: implicit declaration of function 'ELF64_ST_INFO' is invalid in C99 [-Wimplicit-function-declaration]
ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
^
icu/source/tools/toolutil/pkg_genc.c:869:13: error: initializer element is not a compile-time constant
ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
^~~~~~~~~~~~~~~~~~~
icu/source/tools/toolutil/pkg_genc.c:987:13: error: initializer element is not a compile-time constant
ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
コンパイルラインは次のとおりです。:
android-toolchain/bin/arm-linux-androideabi-clang -D_REENTRANT -DU_HAVE_ELF_H=1 \
-DU_HAVE_ATOMIC=1 -Iicu/source/common -Iicu/source/i18n \
-DU_BUILD="x86_64-apple-darwin15.2.0" -DU_HOST="arm-unknown-linux-androideabi" \
-DU_CC="android-toolchain/bin/arm-linux-androideabi-clang" \
-DU_CXX="android-toolchain/bin/arm-linux-androideabi-clang++" \
-DUNISTR_FROM_CHAR_EXPLICIT=explicit -DUNISTR_FROM_STRING_EXPLICIT=explicit \
-DU_ATTRIBUTE_DEPRECATED= -DU_TOOLUTIL_IMPLEMENTATION -O3 -O2 -pipe -fsigned-char \
-fPIC -D__ANDROID__ -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -std=c99 \
-Wall -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -c \
-DPIC -fPIC -o pkg_genc.o icu/source/tools/toolutil/pkg_genc.c
私ができる私は19ビルド後に何も設定APIの対象とツールチェーンを使用する場合はICUのコンパイルビルドは、これらのエラーで失敗失敗しますpkg_genc.cの先頭にELF64_ST_INFO
の定義を追加することでビルドを成功させることができます。そのため、Androidシステムヘッダでこのマクロの定義が不足していることが問題であることはかなり肯定的です。なぜこれがAPIレベルで変更されたのか誰にも分かりますか?これは意図的な違いか、これはNDKのバグですか?
あなたの質問はどこか別の答えがありますか? – mgautierfr
@mgautierfrいいえ、私は決してこれに答えました。私は誇りに思っていませんが、ELF64_ST_INFOを定義するためのハックはうまくいきました。 –