2015-12-18 523 views
1

我試圖跨編譯一個簡單的hello程序作爲獨立的應用程序,它將作爲二進制文件在arm板上運行,但是我在arm板上運行hello二進制文件時遇到問題。交叉編譯ARM板?

下面是步驟我都遵循: -

使ARCH =手臂CROSS_COMPILE = ARM-Linux的gnueabi-你好

現在你好是成功打造,當我使用檢查打招呼的文件類型文件命令: -

$文件你好 你好:ELF 32位LSB的可執行文件,ARM,版本1(SYSV),靜態鏈接,用於GNU/Linux 2.6.31,BuildID [SHA1] = 0x68edccf6dba1057774e3d7853914578e53889a75,不剝離

當我的Android Linux的電話推該二進制下/數據文件夾

1- ADB推你好/數據

2- CHMOD 777 /數據/你好

3- ./hello(但這裏你好是不能運行)

有人可以給我提示,當我在電話上編譯或運行二進制文件時,我正在犯什麼錯誤。

我得到奇怪的錯誤信息,同時運行的程序如下圖所示: -

根@ XXX:/數據#./hello

./hello

打開失敗:沒有這樣的文件或目錄

1 |根@ XXX:/數據#SH你好

SH你好

你好[1]:語法錯誤: '☺üê4┤¡♣☻♣4' 意外

1 |根@ XXX:/數據#

+0

你有arm編譯的libc嗎? – Joe

+0

@Joe我無法理解你的觀點 –

回答

3

的Android需要Position Independent Code爲本地庫。嘗試將-pie -fpie標誌添加到編譯器。另一個問題可能是@Joe描述的問題。在Android上,有一個Bionic標準庫。如果你的「你好」的程序不使用任何標準電話,你可以嘗試沒有標準庫編譯(使用NDK提供的工具鏈):但是

arm-linux-androideabi-g++ -pie -fpie -nostdlib hello.c -o hello 

更好的選擇是創建一個簡單的Android.mk文件:

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES:= hello.c 
LOCAL_MODULE_TAGS:= test 
LOCAL_MODULE:= hello 
include $(BUILD_EXECUTABLE) 

並通過發出mm命令使用它裏面已經set up Android SDK

如果你想使用標準庫,並由於某種原因不想使用Android。mk,那麼你可以下載(並建立)所有的Android源代碼,並將包含路徑傳遞給gcc(示例):

arm-linux-androideabi-g++ -pie -fpie --sysroot=<path_to_android_sources>/out/target/product/<product>/obj/ 
-I<path_to_android_sources>/bionic/libc/arch-arm/include/ -I<path_to_android_sources>/bionic/libc/include/ 
-<path_to_android_sources>/bionic/libstdc++/include/