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
PS:在ndk编译的时候,加上-B参数,可以强制重新编译,那样每次改动都可以验证是否有出错了。
PS2:这里使用的是quick-x2.2.6版本
参考资料:
NDK Build 用法(NDK Build)
安卓系统源码编译系列(四)——LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_STATIC_LIBRARIES的区别浅析
Android NDK开发指南(一) Application.mk文件