Gcc android工具链缺少crtbegin_so.o(自定义构建)

Gcc android工具链缺少crtbegin_so.o(自定义构建),gcc,android-ndk,gdc,Gcc,Android Ndk,Gdc,我已经使用android build-gcc.sh脚本与gcc一起编译了gdc,并在build/core/definitions.mk中包含了一个新的存根,以作为构建过程的一部分处理D语言文件。我知道现在一切正常,但我的问题是链接: 当我构建项目时,会出现以下错误: ld: crtbegin_so.o: No such file: No such file or directory 对于常规的c-only项目也是如此。现在,我在构建目录中运行了一个快速查找,发现文件(crtbegin_so.o

我已经使用android build-gcc.sh脚本与gcc一起编译了gdc,并在build/core/definitions.mk中包含了一个新的存根,以作为构建过程的一部分处理D语言文件。我知道现在一切正常,但我的问题是链接:

当我构建项目时,会出现以下错误:

ld: crtbegin_so.o: No such file: No such file or directory
对于常规的c-only项目也是如此。现在,我在构建目录中运行了一个快速查找,发现文件(crtbegin_so.o)确实存在于我编译gcc(或者更确切地说,在build-gcc.sh构建它时)时指定的sysroot中

  • 我可以找些什么来解决这个问题

  • 在本地复制这些文件并直接链接到它们,这在将来是一个不错的解决方案吗 临时的

  • 为什么ld(或collect2)会尝试将它们包含在gdc(D语言)链接中


这个问题也出现在NDK r7c for linux上

我发现工具链忽略了平台位置($NDK_ROOT/platforms/android-8/arch arm/usr/lib/),并在工具链路径中搜索它,这是不正确的

但是,由于工具链还搜索当前目录中的文件,一种解决方案是将正确的平台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

因此,你的第二点应该是可行的(你可以做一个符号链接,而不是复制)

注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"

我在两个不同的案例中面临同样的问题:

  • 在android的构建过程中
  • 在使用项目期间
  • 一旦我切换到
    独立工具链
    问题消失,下面是准备
    独立工具链

    $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
    
    特定于增压的

    对于boost,您需要在
    jam
    中多次指定
    --sysroot

    <compileflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
    <linkflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
    
    --sysroot=$NDK_ROOT/platforms/android-9/arch arm
    --sysroot=$NDK_ROOT/platforms/android-9/arch arm
    
    我发现将
    --sysroot=$(sysroot)
    添加到编译器选项可以修复错误:

    无法打开crtbegin_so.o:没有这样的文件或目录

    从我的makefile

    CC= $(CROSS_COMPILE)gcc -fvisibility-hidded $(INC) $(LIB) -shared
    
    注意:这假定已运行setenv-android.sh来设置环境

    $/setenv android.sh

    在我的例子中,sysroot路径中缺少引号。 当我改变

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


    该项目已成功编译并链接。

    为我解决了它:)这太棒了,谢谢!现在,我可以根据android工具链构建gdc。在VS2019中,由于这是链接器阶段的一部分,我需要将
    --sysroot=“$(SysrootLink)”
    添加到链接器命令行选项中
    --sysroot="${ANDROID_NDK}\platforms\android-17\arch-arm"