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

时间:2011-07-30 04:54:11

标签: gcc android-ndk gdc

我使用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语言)链接中?

4 个答案:

答案 0 :(得分:11)

问题出现在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"

答案 1 :(得分:5)

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

  

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

来自我的makefile ...

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

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

答案 2 :(得分:1)

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

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

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

项目已成功编译和链接。

答案 3 :(得分:0)

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

  1. 在构建boost for android
  2. 期间
  3. 在使用android-cmake项目期间。
  4. 切换到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