8

Android build-gcc.sh スクリプトを使用して gcc と一緒に gdc をコンパイルし、build/core/definitions.mk に新しいスタブを含めて、ビルド プロセスの一部として D 言語ファイルを処理しました。この時点で問題なくコンパイルされていることはわかっていますが、私の問題はリンクです。

プロジェクトをビルドすると、次のエラーが発生します。

ld: crtbegin_so.o: No such file: No such file or directory

これは、通常の c のみのプロジェクトにも当てはまります。ここでビルド ディレクトリをすばやく検索したところ、gcc をコンパイルしたとき (または build-gcc.sh でビルドしたとき) に指定した sysroot 内にファイル (crtbegin_so.o) が存在することがわかりました。

  • この問題の解決策を見つけるために私が探すことができるものは何ですか?

  • ファイルをローカルにコピーしてそれらに直接リンクすることは、当面の適切な解決策でしょうか?

  • ld (または collect2) が gdc (D 言語) リンケージのためにこれらを含めようとするのはなぜですか?

4

4 に答える 4

12

この問題は、Linux 用の NDK r7c でも発生します。

ツールチェーンがプラットフォームの場所($NDK_ROOT/platforms/android-8/arch-arm/usr/lib/)を無視し、ツールチェーン パスでそれを検索することがわかりましたが、これは正しくありません。

ただし、ツールチェーンは現在のディレクトリ内のファイルも検索するため、1 つの解決策は、正しいプラットフォームの crtbegin_so.o および crtend_so.o をソース ディレクトリにシンボリック リンクすることです。

cd src && ln -s NDK_ROOT/platforms/android-8/arch-arm/usr/lib/crtbegin_so.a

cd src && ln -s NDK_ROOT/platforms/android-8/arch-arm/usr/lib/crtend_so.a

したがって、2番目のポイントがうまくいくはずです(コピーの代わりにシンボリックリンクを作成できる場所)

注 1:これは、コードが NDK を使用して API8 (Android 2.2) 用にコンパイルされていることを前提としています。必要に応じてパスを正しいパスに変更してください。

注 2:使用されるフラグを構成します。

./configure \
--host=arm-linux-androideabi \
CC=arm-linux-androideabi-gcc \
CPPFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/" \
CFLAGS="-nostdlib" \
LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/" \
LIBS="-lc"
于 2012-04-24T09:21:39.300 に答える
1

私の場合、sysroot パスに引用符がありませんでした。私が変わったとき

--sysroot=${ANDROID_NDK}\platforms\android-17\arch-arm

--sysroot="${ANDROID_NDK}\platforms\android-17\arch-arm" 

プロジェクトは正常にコンパイルおよびリンクされました。

于 2016-04-24T15:27:52.563 に答える
0

私は2つの別々のケースで同じ問題に直面しました:

  1. boostアンドロイドのビルド中
  2. android-cmakeプロジェクトの使用中。

standalone toolchainissue gone に切り替えたら、準備するコマンドの例を次に示しますstandalone toolchain

$NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=android-toolchain --ndk-dir=$NDK_ROOT --system=darwin-x86_64 --toolchain=arm-linux-androideabi-4.9

ブースト固有

--sysrootブーストの場合は、で数回指定する必要がありますjam

<compileflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
<linkflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
于 2015-11-29T19:31:38.640 に答える