我已经使用android build-gcc.sh脚本编译了gdc和gcc,并在build/core/definitions中包含了一个新的存根。mk来处理D语言文件,作为构建过程的一部分。我知道事情正在编译OK,但我的问题是链接:
当我构建一个项目时,我得到这个错误:
ld: crtbegin_so.o: No such file: No such file or directory
对于常规的纯c项目也是如此。现在,我在构建目录中快速运行查找,并发现文件(crtbegin_so.o)确实存在于我在编译gcc(或者更确切地说,在build-gcc.sh构建它时)所指定的sysroot中。
我可以寻找一些事情来解决这个问题?
将文件复制到本地并直接链接到它们是一个体面的解决方案吗临时吗?
为什么ld(或collect2)试图将这些包含在gdc (D语言)链接中?
这个问题也出现在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"
我发现添加--sysroot=$(SYSROOT)
到编译器选项修复错误:
无法打开crtbegin_so。0:没有这样的文件或目录
from my makefile…
CC= $(CROSS_COMPILE)gcc -fvisibility-hidded $(INC) $(LIB) -shared
注意:这假设已经运行了setenv-android.sh来设置环境$. ./setenv-android.sh
在我的例子中,sysroot路径中缺少引号。当我改变
--sysroot=${ANDROID_NDK}platformsandroid-17arch-arm
--sysroot="${ANDROID_NDK}platformsandroid-17arch-arm"
项目编译并链接成功
我在两个不同的情况下遇到了同样的问题:
- 在构建
boost
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
提高特定
对于boost,您需要在jam
--sysroot
<compileflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
<linkflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm