本文為個人工作中處理遇到的編譯問題做個小結,后續遇到新的問題,持續更新。
No such file or directory:
1. 檢查路徑是否有問題,文件是否存在,若文件存在且路徑沒問題
2. 檢查文件的路徑目錄和文件是否具有可讀權限
代碼中的 error:
: error: package ....... does not exist
1. 確認該代碼中所用的包名是否正確;
2. 包名正確的情況,該包所在的jar是否引入,參與編譯,查看out/target/common/obj/JAVA_LIBRARIES下是否存在jar包模塊名對應的intermediates目錄。
: error: cannot find symbol
1. 請確認該關鍵字或類名是否聲明,包的引入是否正確;
2. 如果依賴其他的jar包或者庫,確認jar包和庫是否正確引入,查看out/target/common/obj/JAVA_LIBRARIES下是否存在jar包模塊名對應的intermediates目錄。
: error: unmappable character for encoding UTF-8
1. 請檢查文件的字符集,在UTF-8下打開無亂碼,修改代碼的字符集;
2. 或者在Android.mk中加入 LOCAL_JAVACFLAGS := -encoding GBK 來使代碼以GBK編碼方式編譯。
: error: undefined reference to
1. 請聯系該代碼的維護人員檢查該符號是否定義或者頭文件是否已包含進來
2. 如果定義在第三方的庫中,先去out目錄檢查第三方庫是否參與編譯,以及用工具查看第三方庫中是否包含該函數
(代碼中的錯誤大部分由代碼語法導致,比較多,持續補充)
No Android.mk in .... :
1. 該目錄下沒有Android.mk文件,需要該目錄的維護人員添加Android.mk;
2. 檢查該路徑的檔案權限是否可讀。
Permission denied:
1. 路徑權限有問題,查看該路徑對應目錄和文件的權限屬性
make: *** No rule to make target `.......', needed by `......'. Stop. :
1. 如果前方對應缺失的是動態庫,靜態庫或者jar包,需要先將這些庫編譯出來;
2. 如果是第三方的庫,需要先將庫預編譯,才可以依賴;
3. 檢查對應的庫的Android.mk中LOCAL_MODULE_TAGS是否與環境統一,否則不參與編譯。
(這個錯誤在源碼編譯包括目錄編譯mmm中非常常見,解決的方法比較雜大都在Android.mk中做修改)
Package modules must define LOCAL_PACKAGE_NAME. Stop:
1. 如日志所說,每個apk編譯時include $(BUILD_PACKAGE),都需要指定LOCAL_PACKAGE_NAME
error: ld returned 1 exit status:
unknown mandatory eabi object attribute 44:
鏈接的庫所用的編譯器工具鏈與鏈接用的不兼容,需要換個工具鏈來編該庫
Android.mk 1:*** missing separator
因為構建系統對mk文件的解析,因為某個關鍵字前面或后面少空格