一 ubuntu中編譯c文件
- vim main.c
編輯
int main(){
printf("111\n");
return 0;
}
-
gcc main.c 將生成a.out文件
-
vi mian.c 添加頭文件
#include <stdio.h>
- gcc -o main main.c
生成一個可執行文件main - 執行./main
打印結果:11111
這個main文件在Android手機中不能執行,這是因爲兩個設備不同,對應的指令集不同
想要在ubuntu中編譯出在Android手機中可以執行的文件,需要下載NDK中對應的交叉編譯工具
二 ubuntu配置NDK
1 下載 wget
找到ndk的官網下載地址,注意選Linux平臺
wget ndk的url地址
2 配置臨時環境變量
export CC=android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
3 編譯main.c
$CC main.c
<stdio.h>報錯,
@ubuntu:~$ export CC=android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
bao@ubuntu:~$ $CC main.c
main.c:1:19: fatal error: stdio.h: No such file or directory
#include <stdio.h>
^
compilation terminated.
需要鏈接對應的頭文件,涉及到鏈接頭文件和庫文件的配置
三 編譯時配置
如果被編譯的文件鏈接了其他頭文件或者庫文件,需要進行配置
類似 javac -classpath xxx
1 查找頭文件
--sysroot=XX
使用xx作爲這一次編譯的頭文件與庫文件的查找目錄,查找下面的 usr/include 目錄
-isysroot XX
頭文件查找目錄,覆蓋--sysroot ,查找 XX/usr/include
-isystem XX
指定頭文件查找路徑(直接查找根目錄)
-IXX
頭文件查找目錄
優先級:
-I -> -isystem -> sysroot
gcc --sysroot=目錄1 -isysroot 目錄2 -isystem 目錄3 -I目錄4 main.c
查找 目錄1/usr/lib 的庫文件
目錄2 /usr/include 的頭文件
還去查找 目錄3 下的頭文件
還去查找 目錄4 下的頭文件
2 查找庫頭文件
-LXX
指定庫文件查找目錄
-lxx.so
指定需要鏈接的庫名
gcc -L目錄1 -l庫名
例子: 鏈接ndk的日誌庫
gcc -LC:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\platforms\android-21\arch-arm\usr\lib
-llog -lGLESv2
還可以
gcc --sysroot=C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\platforms\android-21\arch-arm
-llog -lGLESv2
四 使用NDK的gcc和.h編譯main.c
export CC=android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
export AAA="--sysroot=/home/bao/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/bao/android-ndk-r17c/sysroot/usr/include -isystem /home/bao/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
$CC $AAA -pie main.c -o main
生成main,用file查看,發現是ARM架構
bao@ubuntu:~$ file main
main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, not stripped
將main文件放到具有root權限的手機中./main執行,能夠輸出:111,這樣就編譯生成了一個Android可用的可執行文件
五 注意
- NDK的版本用17的,不能太新,否則沒有gcc;選擇Linux平臺
- 注意上述命令的地址根目錄,要替換成你的ndk所在根目錄
/home/bao 改成你的ndk所在路徑
- 爲了再Android手機中能夠執行main,編譯必須加上pie
- export是臨時環境變量,關閉命令行後失效