2011-07-30 10 views
6

He compilado gdc junto con gcc usando el script android build-gcc.sh, y he incluido un nuevo apéndice en build/core/definitions.mk para tratar el lenguaje D archivos como parte del proceso de compilación. Sé que las cosas están recopilando OK en este punto, pero mi problema es la vinculación:crtbegin_so.o faltante para android toolchain (compilación personalizada)

Cuando construyo un proyecto, me sale este error:

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

Esto es cierto para los proyectos regulares C solamente así. Ahora ejecuté find en mi directorio de compilación, y encontré que el archivo (crtbegin_so.o) existe en el sysroot que especifiqué cuando compilé gcc (o más bien, cuando build-gcc.sh lo creó).

  • ¿Cuáles son algunas cosas que podría buscar para encontrar una solución a este problema?

  • ¿Copiar los archivos localmente y vincularlos directamente sería una solución decente en el interino?

  • ¿Por qué ld (o collect2) intentaría incluir estos para un enlace gdc (Lenguaje D)?

+1

http://stackoverflow.com/questions/7400124/cant-run-sample-rhodes-application lo resolvió para mí :) – jobwat

Respuesta

10

El problema se plantea en NDK r7c para Linux también.

me encontré con que la cadena de herramientas ignora la ubicación de la plataforma ($ NDK_ROOT/plataformas/android-8/arch-brazo/usr/lib /) y busca en la ruta de cadena de herramientas, lo cual es incorrecto.

Sin embargo, como la cadena de herramientas también busca el archivo en el directorio actual, una solución es enlazar simbólicamente los crtbegin_so.o plataforma correcta y crtend_so.o en el directorio de origen:

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

Así, su segundo punto debería funcionar (donde se puede hacer un enlace simbólico, en lugar de una copia)

NOTA 1: Esto supone que el código se está compilando para API8 (Android 2.2) utilizando el NDK. Por favor, modifique la ruta a la ruta correcta según su requisito.

NOTA 2: banderas de configure:

./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" 
+0

Esto es genial, gracias! Ahora puedo construir gdc contra la cadena de herramientas de Android. – dwerner

0

que enfrentan al mismo problema en dos casos separados:

  1. durante la construcción de boost para android
  2. durante usar android-cmake proyecto.

Una vez que he cambiado a standalone toolchain tema ido, aquí es ejemplo de comando que preparan 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 específica

de impulso que necesita especificar --sysroot varias veces en su jam

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

He encontrado que la adición de --sysroot=$(SYSROOT) a las opciones del compilador corrige el error:

cannot open crtbegin_so.o: No such file or directory

de mi makefile ...

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

Nota: esto supone que el setenv-android.sh se ha ejecutado para configurar el entorno
$. ./setenv-android.sh

1

En mi caso, las comillas no se encontraban en la ruta del sysroot. Cuando cambié

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

a

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

el proyecto se compila y se enlaza con éxito.

Cuestiones relacionadas