轉(zhuǎn)載請(qǐng)注明原創(chuàng):http://www.reibang.com/p/27f98165d73d
環(huán)境:Android Studio 3.0 ?+ NDK 15
編譯時(shí)出現(xiàn)了如下錯(cuò)誤,之前也出現(xiàn)過(guò)這個(gè)錯(cuò)誤,但是后來(lái)我把ndk目錄下sysroot/usr/include/arm-linux-androideabi/asm 拷貝到了能訪問(wèn)到的地方拧略,編譯32位庫(kù)時(shí)沒(méi)有問(wèn)題了表蝙,但是編譯64位庫(kù)時(shí)出現(xiàn)了問(wèn)題,一開始沒(méi)管劫映,后來(lái)直接編譯不過(guò)了违孝,無(wú)奈,繼續(xù)來(lái)接這個(gè)問(wèn)題泳赋。
查看這個(gè)問(wèn)題就要查看出現(xiàn)的原因雌桑,從AS的gradle console中可以看到整個(gè)gradle編譯的log,我從log中找到了cmake編譯命令祖今,如下:
/home/cc/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi --gcc-toolchain=/home/cc/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 --sysroot=/home/cc/Android/Sdk/ndk-bundle/sysroot -Dtest_EXPORTS -I../../../../src/main/cpp/include -isystem /home/cc/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem /home/cc/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem /home/cc/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/backward -isystem /home/cc/Android/Sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -Wno-error=format-security -Wno-error=pointer-sign -O0 -fno-limit-debug-info -fPIC -MD -MT CMakeFiles/test.dir/src/main/cpp/Coretest.cpp.o -MF CMakeFiles/test.dir/src/main/cpp/Coretest.cpp.o.d -o CMakeFiles/test.dir/src/main/cpp/Coretest.cpp.o -c /home/cc/android-workspace/opengldemo/gspotsensor/src/main/cpp/Coretest.cpp
-Ixxx ?表示工程中手動(dòng)添加的include目錄筹燕。
-isystem 表示cmake添加的編譯時(shí)引用的目錄
這兩種寫法類似于gcc中的-I,只不過(guò)cmake又區(qū)分了一下用戶寫的和系統(tǒng)添加的罷了。
這個(gè)命令可以手動(dòng)運(yùn)行撒踪,但是需要到.externalNativeBuild/cmake/debug/armeabi-v7a 目錄下过咬,否則會(huì)提示CMakeFiles/test.dir/src/main/cpp/Coretest.cpp.o文件找不到。
上面的錯(cuò)誤中提示asm/types.h找不到制妄,就需要在ndk的目錄中搜索asm目錄掸绞,發(fā)現(xiàn)在/home/cc/Android/Sdk/ndk-bundle/sysroot/usr/include/中有好幾個(gè),具體選擇哪一個(gè)耕捞,要根據(jù)使用的架構(gòu)類型決定衔掸,上面命令中用的是arm-linux-androideabi,那我們肯定也要用這個(gè)俺抽,所以就在上面命令中添加了“-isystem /home/cc/Android/Sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi”敞映,結(jié)果就可以運(yùn)行了。
然后我就把這一句添加到了項(xiàng)目的Cmakelists.txt中磷斧,有兩種方式:
這兩種方式都行振愿,第一種是把這個(gè)引用當(dāng)做參數(shù),第二種方式是把這個(gè)目錄當(dāng)做include包含進(jìn)來(lái)弛饭。
#SET(CMAKE_CXX_FLAGS "-isystem /home/cc/Android/Sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi")
#include_directories(/home/cc/Android/Sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi)
到這里問(wèn)題基本解決冕末,但是還有個(gè)路徑問(wèn)題,這里我寫的是絕對(duì)路徑侣颂,這樣這個(gè)工程給到別人就沒(méi)法用了档桃,每次更新完代碼還需要改這個(gè)路徑,所以這里要改成相對(duì)路徑憔晒。
這里也有兩種方式藻肄,
方式1:修改原生cmake腳本
~/Android/Sdk/cmake/3.6.3155560/android.toolchain.cmake,這個(gè)文件中定義了很多可用的宏拒担,在大約428行仅炊,在這里根據(jù)各種編譯架構(gòu),可以設(shè)置include的目錄澎蛛,就是-isystem對(duì)應(yīng)的目錄抚垄,改這里應(yīng)該是可以的,但是我沒(méi)有這么做谋逻,因?yàn)檫@樣我還要跟別的同事改呆馁,這事應(yīng)該Google來(lái)做。如下圖
方式2:仿照上圖毁兆,在項(xiàng)目的Cmakelists.txt中修改:
上半部分浙滤,是根據(jù)編譯框架選擇include目錄,后半部分是我將一些ndk中常用的變量給打印了出來(lái)气堕。
按照這種方式纺腊,編譯OK畔咧。
其實(shí)cmake中遇到的很多錯(cuò)誤都可以使用這一套路來(lái)分析,先找到編譯命令揖膜,再手動(dòng)運(yùn)行這個(gè)命令誓沸,這樣得到的錯(cuò)誤信息更直接,不會(huì)被AS那一堆的問(wèn)題所嚇到壹粟。
順便發(fā)布個(gè)招聘廣告:
常年招聘Android高手拜隧,懂OpenGL者、視頻處理者優(yōu)先趁仙。
地點(diǎn):北京房山
公司處于創(chuàng)業(yè)階段洪添,有很好的項(xiàng)目在做,并且是無(wú)人涉及過(guò)的行業(yè)雀费。