【问题标题】:crtbegin_so.o missing for android toolchain (custom build)android 工具链缺少 crtbegin_so.o(自定义构建)
【发布时间】:2011-10-16 09:45:44
【问题描述】:

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

当我建立一个项目时,我得到这个错误:

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

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

  • 我可以寻找哪些方法来解决这个问题?

  • 在本地复制文件并直接链接到它们是一个不错的解决方案 临时?

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

【问题讨论】:

标签: gcc android-ndk gdc


【解决方案1】:

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 工具链构建 gdc。
【解决方案2】:

我发现在编译器选项中添加--sysroot=$(SYSROOT) 可以修复错误:

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

来自我的 makefile...

CC= $(CROSS_COMPILE)gcc -fvisibility-hidded $(INC) $(LIB) -shared

注意:这里假设已经运行 setenv-android.sh 来设置环境
$. ./setenv-android.sh

【讨论】:

  • 在 VS2019 中,由于这是链接器阶段的一部分,我需要将 --sysroot="$(SysrootLink)" 添加到链接器命令行选项中
【解决方案3】:

在我的情况下,sysroot 路径中缺少引号。 当我改变了

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

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

项目编译链接成功。

【讨论】:

    【解决方案4】:

    我在两个不同的案例中遇到了同样的问题:

    1. 在为 android 构建 boost 期间
    2. 在使用android-cmake项目期间。

    一旦我切换到standalone toolchain,问题就消失了,这里是准备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
    

    提升特定

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

    <compileflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
    <linkflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
    

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多