2013-01-13 8 views
9

Sfondoproblemi di compilazione oggetto usando il braccio-linux-androideabi-gcc

  • OSX è OS
  • R8 NDK

Sto cercando di compilare la classe seguente usando il compilatore GCC Android .. .

#include <stdint.h> 
int main (void){ 
    return 0; 
} 

faccio la con il seguente comando ...

0.123.516,410617 millions
[email protected]:~/Development/Code/OpenGL$ ~/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc hello.c -o hello 

ricevo ...

In file included from hello.c:1:0: 
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/include/stdint.h:3:26: fatal error: stdint.h: No such file or directory 
compilation terminated. 

Quindi, a causa di una mancanza di conoscenza gcc (ma una certa capacità di Google) trovo questo e provarlo ...

[email protected]:~/Development/Code/OpenGL$ ~/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc hello.c -o hello -ffreestanding 

ed io get ...

/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory 
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory 
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc 
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl 
collect2: ld returned 1 exit status 

Qualcuno può aiutarmi con quello che sto facendo male? Mi manca un link o qualcosa del genere? Android.mk non è un'opzione.

UPDATE questo non sta funzionando o ...

arm-linux-androideabi-gcc hello.c --sysroot=~/Development/Android/android-ndk-r8c/platforms/android-9/arch-arm 
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory 
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory 
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc 
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl 
collect2: ld returned 1 exit status 

risposta

6

Quindi, dato che non voglio usare il file Android.mk, sono andato avanti e ho creato una toolchain indipendente. questo viene fatto utilizzando la seguente ...

/Users/un/Downloads/android-ndk-r8d/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/tmp/my-toolchain 
/tmp/my-toolchain/bin/arm-linux-androideabi-gcc hello.c 

Vorrei sapere qual è il "alternativo" è in termini di gcc che collega che potessi fare.

+1

Controlla anche il tuo file application.mk e assicurati che la tua versione della piattaforma sia superiore a 8. – Jackie

+1

Ho avuto bisogno di qualche argomento in più su un sistema operativo Ubuntu:/home/utente/android-ndk-r10d/build/tools $ ./ make-standalone-toolchain.sh --platform = android-21 --install-dir =/tmp/my-toolchain --toolchain = arm-linux-androideabi-4.9 --system = linux-x86_64 E per Mac OS X : /Users/utente/android-ndk-r10d/build/tools $ ./make-standalone-toolchain.sh --platform = android-21 --install-dir =/tmp/my-toolchain --ndk-dir =/Utenti/utente/android-ndk-r10d/--toolchain = arm-linux-androideabi-4.9 --system = darwin-x86_64 – Neonigma

8

Devi dire GCC dove trovare i file di sistema di Android e le intestazioni. O uso:

  1. ndk-build e un Android.mk con BUILD_EXECUTABLE
  2. o, l'opzione --sysroot GCC

[1]

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := foo 
LOCAL_SRC_FILES := foo.c 

include $(BUILD_EXECUTABLE) 

[2]

# Change `android-9` with the level you target 
/path/to/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt\ 
/darwin-x86/bin/arm-linux-androideabi-gcc\ 
--sysroot /path/to/android-ndk-r8c/platforms/android-9/arch-arm/\ 
    foo.c -o foo 

# Or generate a ready-to-use standalone toolchain (better) 
/path/to/android-ndk-r8c/build/tools/make-standalone-toolchain.sh \ 
--platform=android-9 \ 
--install-dir=/tmp/my-android-toolchain 

export SYSROOT=/tmp/my-android-toolchain/sysroot 

/path/to/arm-linux-androideabi-gcc --sysroot $SYSROOT foo.c -o foo 
+0

Sysroot non ha funzionato, Android.mk non è un'opzione. Potrei farlo funzionare se ho creato una toolchain indipendente, ma non c'è un modo per collegare semplicemente le librerie di req? – Jackie

+1

sysroot ** funziona ** (dovresti aver commesso un errore o un errore di battitura). Le soluzioni di cui sopra sono varianti alla stessa cosa: dì al tuo compilatore dove trovare le risorse di sistema. Ne più ne meno. E se hai bisogno di ottenere passaggi/flag dettagliati usati ufficialmente, usa 'ndk-build V = 1' per vedere le uscite. – deltheil

+0

Non ha funzionato qui era il mio codice ... arm-linux-androideabi-gcc ciao.c --sysroot = ~/Sviluppo/Android/android-ndk-r8c/piattaforme/android-9/arch-arm – Jackie

5

Questa risposta aggiunge un po 'più dettagli alla risposta di @ deltheil. Ho avuto problemi simili mentre stavo cercando di compilare I2C-tools per il debug di bus I2C su Android. In qualche modo dopo aver lottato per più di un giorno con i file make e provare diverse opzioni tra cui --sysroot & --dynamic-linker options ecc., Alla fine ho provato a compilarlo all'interno dell'albero Android AOSP. Ho utilizzato il Google Nexus-S AOSP per creare un file binario che intendevo utilizzare sul telefono Samsung S3. Ho creato una cartella chiamata i2c-tools per le fonti all'interno della cartella AOSP/external e copiata Android.mk, Cleanspec.mk & MODULE_LICENCE da un'altra cartella eseguibile (ping) e modificato per I2C-tools come segue:

ifneq ($(TARGET_SIMULATOR), true) 

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_SRC_FILES := i2cdetect.c i2cbusses.c 

LOCAL_C_INCLUDES := $(KERNEL_HEADERS) 
LOCAL_MODULE := i2cdetect 
LOCAL_MODULE_TAGS := tests 
LOCAL_SHARED_LIBRARIES := libc 

include $(BUILD_EXECUTABLE) 

endif 

Poi ho appena eseguito:

source build/envsetup.sh 
make i2cdetect 

dalla cartella di base AOSP e voilà, ho avuto un eseguibile funzionante in fuori/destinazione/prodotto/generico/sistema/bin/cartella. Si noti che ho dovuto copiare tutti i file di origine e di intestazione necessari dagli strumenti originali (i2c-tools)/strumenti & includendo le cartelle e ho dovuto modificare alcune delle #include per rimuovere il percorso aggiuntivo per i file di intestazione che ora si trovavano nello stesso posto di la c-source.

+0

Nota per evitare spazi finali dopo il nome del modulo. Nessun problema simile nell'esempio sopra. – KrisWebDev

0

Nel mio caso, avevo bisogno di un file di .o e non ha bisogno di definire main(). ho dovuto specificare l'opzione -c:

~/ax/arm-linux-androideabi-g++ --sysroot=~/an/platforms/android-8/arch-arm/ -c dummy.c 

dove ~/ascia e ~/un sono i link:

ax -> ~/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/ 
an -> ~/android-ndk-r9d/ 

fatto dummy.o.

0

ho risolto il problema, il file manager di default in Ubuntu compressa non è stata l'estrazione link simbolici, così ho provato: tar jxf filename.tar.bz2 per estrarre i ndk.tar.bz2 e ora funziona benissimo

Problemi correlati