android studio 调试c/c++代码小记
使用的android studio3.0.1版本,sdk 27.
新建的測試程序,勾選了c++支持,默認(rèn)有native_lib.cpp。
1.在cpp中添加了測試的native代碼,提示No implementation found for錯(cuò)誤,怎么看都跟之前的默認(rèn)函數(shù)沒啥區(qū)別啊,于是盯著簡單cpp代碼逐行掃描。。。。。5分鐘后,我去,自動(dòng)生成的代碼extern c竟然沒有跟{},所以默認(rèn)函數(shù)享受了extern c,而我添加的測試代碼被認(rèn)為沒有實(shí)現(xiàn),這絕對是個(gè)坑啊。以上,添加{}問題解決。
2.executing external native build for cmake 錯(cuò)誤,由于添加了其他的測試代碼,準(zhǔn)備進(jìn)行一些模塊功能測試,所以有了目錄分層,所以相當(dāng)于調(diào)整了CMakeLists.txt,然后就是各種錯(cuò)誤,之前只關(guān)注了這個(gè)錯(cuò)誤,并不太熟悉android studio的操作,然后就各種點(diǎn)點(diǎn)點(diǎn),終于發(fā)現(xiàn)了在messages窗口,gradle sync中有CMake Error的提示,比如我的錯(cuò)誤是提示cmakelists.txt中的哪一行出錯(cuò)的,在gradle console中有具體的錯(cuò)誤,提示我好多cpp文件找不到,而這些文件正是我后添加在其他目錄的文件,所以問題明顯,源文件目錄錯(cuò)誤,編譯器找不到。。。。。。以上,修改正確的目錄層級(jí),問題解決。
3.將已有c++代碼導(dǎo)入,編譯時(shí)提示各種標(biāo)準(zhǔn)庫函數(shù)無法使用,比如std::to_string、make_unique等等,分兩步,一個(gè)是因?yàn)闆]有使用c++標(biāo)準(zhǔn)庫,需要參數(shù)arguments "-DANDROID_STL=c++_shared",一個(gè)是因?yàn)樾枰猚++14支持,cppFlags "-std=c++14",這兩問題個(gè)是查了資料:https://stackoverflow.com/questions/22774009/android-ndk-stdto-string-support
4.想要添加另一個(gè)依賴庫代碼,編譯為android平臺(tái)的so,報(bào)錯(cuò):error: linker command failed with exit code 1 (use -v to see invocation),發(fā)現(xiàn)是生成的so與最終依賴庫的位置寫的名字不一致導(dǎo)致的。
5.因?yàn)橹暗腸++代碼中有很多同事的中文注釋,直接用到android studio中會(huì)提示encoding問題,這時(shí)候就需要在Settings--->Editor--->File Encodings中指定編碼格式,點(diǎn)擊右邊的小加號(hào),選擇c++代碼目錄,出現(xiàn)在path中,后面的encoding中選擇GBK,apply-->ok,會(huì)發(fā)現(xiàn)都能正確顯示中文了。
6.需要release版本的庫,選擇窗口左下角的Build Variants,然后選擇對應(yīng)的Variant,當(dāng)然,選擇release之后會(huì)提示錯(cuò)誤,需要配置簽名,這個(gè)大家可以查查,有很多教程。
7.關(guān)于debug進(jìn)入c/c++代碼,找到了一個(gè)方法,edit configurations-->debugger-->symbol directories界面里,點(diǎn)擊右邊的小加號(hào),將項(xiàng)目生成的中間.o文件目錄添加進(jìn)來,之后在c/c++代碼加斷點(diǎn)就可以進(jìn)入調(diào)試了。
8.如果調(diào)試的手機(jī)或者平板沒有全部的打印信息,讓你無法調(diào)試自己的程序,可以網(wǎng)上查找對應(yīng)型號(hào)的設(shè)備如何打開工程模式,因?yàn)楣こ棠J娇梢源蜷_log級(jí)別的設(shè)置,很多設(shè)備都將默認(rèn)logcat級(jí)別設(shè)置的高一點(diǎn),提高性能。
9.編譯出來的so庫比較大,查找資料,發(fā)現(xiàn)需要在cmakelists.txt中設(shè)置strip參數(shù):
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
參考了https://stackoverflow.com/questions/38675403/how-to-config-cmake-for-strip-file,瞬間變小了。
10.使用的so庫接口api,在jni接口中調(diào)用竟然提示error: undefined reference to,明明已經(jīng)連接進(jìn)去了為什么會(huì)出現(xiàn)這個(gè)問題呢,然后將接口extern到j(luò)ni接口中,編譯,依然報(bào)這個(gè)錯(cuò)誤,查看與其他接口差異,發(fā)現(xiàn)問題:沒有使用extern c屬性,所以編譯時(shí)不認(rèn)識(shí)去哪里找接口,添加之后解決問題。
11.有一些平臺(tái)差異的東西,希望在一份源碼中同時(shí)維護(hù),在cmakelist.txt中添加宏,方式就是:
add_definitions(-DANDROID),代表ANDROID宏,-D代表是defined12.不同庫函數(shù)有重名沖突的,可以在Cmakelists.txt中使用:
SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS -Wl,--no-undefined,--version-script,${PROJECT_SOURCE_DIR}/xxx/export.map)
SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS -Wl,--no-undefined,--retain-symbols-file,${PROJECT_SOURCE_DIR}/xxx/export.sym)
參考:https://www.2cto.com/kf/201703/610953.html
13.build variant無法切換debug和release的問題,應(yīng)該是緩存問題,我嘗試刪除了.idea目錄重新打開android studio就可以切換了。
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的android studio 调试c/c++代码小记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么输入两个数然后求差值_p
- 下一篇: 工业机器人 答案 韩建海_不可或缺:协作