我使用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语言)链接中?
答案 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)
我在两个不同的案例中遇到了同样的问题:
boost
for android 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