Cocos2D-X中NDK編譯的一些報錯

xxx函數重定義的報錯

在Cocos2D-X的安卓工程(proj.android)中,里面有個jni文件夾,里面有一些編譯安卓包要用到的makefile文件,在我的移植過程中,發現編譯過程中,在鏈接部分,常常有XXX重定義的報錯,如下:

D:/Android/android-ndk-r10c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androide
abi/bin/ld.exe: error: jni/../../librtmp/android/librtmp.a(json_value.o): multiple definition of 'Json::Value::get(char const*, Json::Value const&) const'
D:/Android/android-ndk-r10c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: jni/../../librtmp/android/librtmp.a(json_value.o): previous definition here

這種報錯可以考慮是多次引入了.a靜態文件導致的。
在經過一輪查找后,發現在Android.mk文件的配置中,我把LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_STATIC_LIBRARIES搞混了。

LOCAL_STATIC_LIBRARIES
  These are the static libraries that you want to include in your module. Mostly, we use shared libraries, but there are a couple of places, like executables in sbin and host executables where we use static libraries instead.

LOCAL_WHOLE_STATIC_LIBRARIES
  These are the static libraries that you want to include in your module without allowing the linker to remove dead code from them. This is mostly useful if you want to add a static library to a shared library and have the static library's content exposed from the shared library.

從以上內容可知,LOCAL_WHOLE_STATIC_LIBRARIES會加載整個靜態庫,LOCAL_STATIC_LIBRARIES只是加載靜態庫中用到的函數。看起來它們作用只是使最終生成的庫文件大小不一樣而已,但是卻不僅僅如此。

這里主要解釋下兩者的區別,具體解析可以查看參考資料處。

隨后,我把要引入的rtmp庫的那行由

LOCAL_WHOLE_STATIC_LIBRARIES += rtmp

改為

LOCAL_STATIC_LIBRARIES += rtmp

這個錯誤就消除了。

xxx::xxx not a member of xxx

  • 這種報錯,一般是沒有正確的引入相關頭文件或者是沒有用相關的命名空間導致的。
  • 如果用到了C++11或者其他新特性,注意給Application.mk文件加上如下參數
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -std=c++11
  • NDK版本太久的話,里面的編譯器是不支持C++11的。可以下載新的NDK,然后在Application.mk文件中加入如下參數:
NDK_TOOLCHAIN_VERSION = 4.8 #這個根據你自己的NDK的toolchains包含版本填寫

這里為什么是4.8呢,因為在查看自己的NDK安裝目錄下的toolchains文件夾時,看到有版本為4.8的編譯器文件夾,因此這里就填了4.8

Paste_Image.png

PS:在ndk編譯的時候,加上-B參數,可以強制重新編譯,那樣每次改動都可以驗證是否有出錯了。
PS2:這里使用的是quick-x2.2.6版本


參考資料:
NDK Build 用法(NDK Build)
安卓系統源碼編譯系列(四)——LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_STATIC_LIBRARIES的區別淺析
Android NDK開發指南(一) Application.mk文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容