8

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

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

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

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

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

  • 在此期间,将文件复制到本地并直接链接到它们会是一个不错的解决方案吗?

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

4

4 回答 4

12

该问题也出现在适用于 linux 的 NDK r7c 上。

发现工具链忽略了平台位置($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"
于 2012-04-24T09:21:39.300 回答
5

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

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

从我的makefile...

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

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

于 2016-01-26T15:23:41.323 回答
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

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

  1. boost在为 android构建期间
  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

提升特定

对于提升,您需要--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 回答