【问题标题】:Android: error: cannot open crtbegin_dynamic.o: No such file or directoryAndroid:错误:无法打开 crtbegin_dynamic.o:没有这样的文件或目录
【发布时间】:2023-03-05 08:49:01
【问题描述】:

我使用了以下...

~/Development/Android/android-ndk-r8c/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/Users/me/toolchain

然后我创建以下代码文件...

int main ()
{
  return 0;
}

我试过了……

<toolchain>/arm-linux-androideabi-gcc test.c

我也试过

 <toolchain>/arm-linux-androideabi-gcc --sysroot=<toolchain>/sysroot test.c 

两个都回来了……

 toolchain/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory

【问题讨论】:

  • 有什么方法可以手动链接它,因为显然有些东西是关闭的?
  • 我也试过 export LD=arm-linux-androideabi-ld 但还是没有骰子。

标签: android-ndk


【解决方案1】:

这对我有用,我遇到了同样的问题,我试图在 NDK 中构建 gcc-4.8 工具链并遇到了同样的问题。尽管我的情况有点不同,但我是在 Android 设备上构建的,这意味着我在 /system/lib 中有 Bionic 库 libc.solibdl.so。配置libgomp 时出现此错误:

toolchain-build/binutils-2.23/ld/ld-new: cannot find crtbegin_dynamic.o: No such file or directory
toolchain-build/binutils-2.23/ld/ld-new: cannot find -lc
toolchain-build/binutils-2.23/ld/ld-new: cannot find -ldl
toolchain-build/binutils-2.23/ld/ld-new: cannot find crtend_android.o: No such file or directory

Make 文件将 -B 选项设置为特定目录 toolchain/gcc-4.8/gcc/,因此我从 /system/libgcc-4.8/gcc 的这两个共享库创建了符号链接。然后我将crtbegin_dynamic.ocrtend_android.o 符号链接到目标文件crtbegin.ocrtend.o 编译并安装到toolchain-build/prefix/lib/gcc/arm-linux-androideabi/4.8/thefind`命令可以帮助您找到它们。

我用来制作符号链接的命令如下所示:

ln -s ../../prefix/lib/gcc/arm-linux-androideabi/4.8/crtend.o crtend_android.o

toolchian-build/gcc-4.8/gcc 目录中,对我来说这很有效,因为这是配置指向搜索的位置,将-B 选项make 传递给xgcc

我希望对某人有所帮助。是时候转到libatomic 了; )

【讨论】:

    【解决方案2】:

    /arm-linux-androideabi-gcc test.c

    你在这个中缺少sysroot


    /arm-linux-androideabi-gcc --sysroot=/sysroot test.c

    这个sysroot错了。它应该类似于:

    --sysroot=/opt/android-ndk-r9/platforms/android-18/arch-arm
    

    您还需要导出 LD(所有工具都应该在路径上):

    $ echo $PATH
    /opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin:
    /opt/android-sdk-macosx/tools/:/opt/android-sdk-macosx/platform-tools/:/opt/local/bin:
    /opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
    $ echo $LD
    arm-linux-androideabi-ld
    

    您可能应该导出工具链中的所有工具:

    export CPP=arm-linux-androideabi-cpp
    export CC=arm-linux-androideabi-gcc
    export CXX=arm-linux-androideabi-g++
    export LD=arm-linux-androideabi-ld
    export AS=arm-linux-androideabi-as
    export AR=arm-linux-androideabi-ar
    export RANLIB=arm-linux-androideabi-ranlib
    

    如果您正在处理 Autoconf 项目,请添加以下内容:

    $ echo $ANDROID_SYSROOT
    /opt/android-ndk-r9/platforms/android-18/arch-arm
    export CPPFLAGS="--sysroot=$ANDROID_SYSROOT"
    export CFLAGS="--sysroot=$ANDROID_SYSROOT"
    export CXXFLAGS="--sysroot=$ANDROID_SYSROOT"
    

    【讨论】:

      【解决方案3】:

      为了更简单,只需设置 sysroot:

      <toolchain>/arm-linux-androideabi-g++ ~/test.c -o ~/test --sysroot=/home/user/android-ndk/platforms/android-9/arch-arm/
      

      【讨论】:

      • 谢谢,对于没有那个讨厌的 ndk-build 包装器的构建来说,--sysroot 似乎确实是强制性的。
      • 非常感谢@BlueSilver 找到这个需要很多时间!
      【解决方案4】:

      好吧,回想起来,我根据命令为 Android-9 制作了工具链...

      ~/Development/Android/android-ndk-r8c/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/tmp/my-toolchain

      我跑的时候……

      <install>/android-ndk-r8c$ find ./ -name crtbegin_dynamic*
      .//platforms/android-14/arch-arm/usr/lib/crtbegin_dynamic.o
      .//platforms/android-14/arch-mips/usr/lib/crtbegin_dynamic.o
      .//platforms/android-14/arch-x86/usr/lib/crtbegin_dynamic.o
      .//platforms/android-3/arch-arm/usr/lib/crtbegin_dynamic.o
      .//platforms/android-4/arch-arm/usr/lib/crtbegin_dynamic.o
      .//platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o
      .//platforms/android-8/arch-arm/usr/lib/crtbegin_dynamic.o
      .//platforms/android-9/arch-mips/usr/lib/crtbegin_dynamic.o
      .//platforms/android-9/arch-x86/usr/lib/crtbegin_dynamic.o
      

      如您所见,我安装的 android-9 出于某种原因没有此文件。我为 android-14 重建,一切正常。有人知道这是怎么回事吗? Bonehead 文件是我移动的吗?

      【讨论】:

      • 这不是正确的答案。 BlueSilver 的 --sysroot 是命令行中缺少的内容,导致缺少 crtbegin_dynamic.o
      猜你喜欢
      • 1970-01-01
      • 2020-05-20
      • 2015-02-25
      • 2019-07-27
      • 2013-12-15
      • 2014-03-02
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多