ndk 编译 c++ 兼容性问题汇总整理

转载 2014年03月21日 16:56:42

转自:http://blog.csdn.net/wenrenwang/article/details/12003671

  1. __int64找不到符号
采用int64_t来代替:
#if defined(__ANDROID__)
typedef int64_t __int64;
#endif

  1. <sys/io.h>找不到
android下不需要直接引用该文件,用下面的宏去掉即可
#if !defined(__APPLE__) && !defined(__ANDROID__)
#include <sys/io.h>
#endif

  1. SO_NOSIGPIPE找不到
SO_NOSIGPIPE在mac中存在,可惜在android中不存在。请使用MSG_NOSIGNAL来代替
#if defined(__ANDROID__)
#define SO_NOSIGPIPE MSG_NOSIGNAL
#endif

  1. uint64_t, int64_t, uint32_t, int32_t等类似类型找不到
请检查你的头文件包含,将系统的头文件放在自已的头文件之前。因为你自己的头文件有可以定义了重复的类型,导致系统头文件出错。

  1. S_IREAD、S_IWRITE或者__S_IREAD、__S_IWRITE找不到
请用S_IRUSR、S_IWUSR代替

  1. pthread_cancel找不到
这个android并未实现,有一些替代方法,具体见:http://bbs.rosoo.net/thread-10289-1-1.html

  1. getifaddrs, <ifaddr.h> 找不到
android并没有实现。不过谢天谢地,有人已经帮我们实现了。感谢一下他:
https://github.com/kmackay/android-ifaddrs

  1. <sys/statvfs.h>找不到
请用此来代替:

#if defined(__ANDROID__)
#  include <sys/vfs.h>
#  define statvfs statfs
#else
#  include <sys/statvfs.h>
#endif


转自:http://www.52rd.com/Blog/Detail_RD.Blog_DamonKabo_68286.html

在下载编译android源码的过程中,将碰到的问题整理如下:

一.

frameworks/base/include/utils/KeyedVector.h:193:31: error: ‘indexOfKey’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
frameworks/base/include/utils/KeyedVector.h:193:31: note: declarations in dependent base ‘android::KeyedVector<android::String8, android::sp<AaptDir> >’ are not found by unqualified lookup
frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1

解决办法

引起此问题的大致原因是编译器是不识别某些nonconformance code,解决办法是在相应位置加上-fpermissive来屏蔽编译器对此类代码的排斥。

frameworks/base/tools/aapt/Android.mk

Add '-fpermissive' to line 31:
LOCAL_CFLAGS += -Wno-format-y2k -fpermissive

但是继续报错:cc1plus: warning: unrecognized command line option "-Wno-format-y2k-fpermissive"







解决办法

这类错误是找不到所需要的库文件:cannot find -lxxxxx ,其中lxxxxx代表的是libxxxxx.so,引起的原因一般有两个方面:

a)由于.so是编译临时生成的文件,如果前面的文件编译出错,libxxxxx.so没有生成,就会报错。

b)由于本机环境所造成的:  

    1.系统缺乏对应的库文件-->下载相应的库文件,ubuntu一般通过命令apt-get install libxxxxx-dev来安装
    2.版本不对应----------------->同上
    3.库文件的链接错误-------->通过find或者locate指令定位到链接文件,查看链接文件是否正确的指向了我们希望的lib,如果不是,用 ln -sf */libxxx.so.x */libxxx.so 指令修改它。
    4.库文件路径设置问题------>如果是库文件路径引发的问题,可以到/etc/ld.so.conf.d目录下,修改其中任意一份conf文件,(可以自建conf,以方便识别)将lib所在目录写进去,然后在终端输入 ldconfig 更新缓存

三.

host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
<command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]
frameworks/base/tools/obbtool/Main.cpp:1:0: note: this is the location of the previous definition
cc1plus: all warnings being treated as errors
make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

解决办法

原因是GCC版本太高,需要吧GCC版本修改为4.4.6

sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4

在ubuntu上将默认的GCC和G++版本改为4.4使用以下命令


1.sudo rm /usr/bin/gcc 

2.sudo ln -/usr/bin/gcc-4.4 /usr/bin/gcc

四.

target thumb C++: libmedia <= frameworks/base/media/libmedia/MediaScanner.cpp
frameworks/base/media/libmedia/MediaScanner.cpp: In function ‘bool android::fileMatchesExtension(const char*, const char*)’:
frameworks/base/media/libmedia/MediaScanner.cpp:84: error: invalid conversion from ‘const char*’ to ‘char*’
frameworks/base/media/libmedia/MediaScanner.cpp:90: error: invalid conversion from ‘const char*’ to ‘char*’
make: *** [out/debug/host/linux-x86/pr/sim/obj/SHARED_LIBRARIES/libmedia_intermediates/MediaScanner.o] Error 1

解决办法

因为GCC4.4版本在编译时不支持const char* 和char*的转换,在其它的GCC版本上应该都能编译过。具体解释http://gcc.gnu.org/gcc-4.4/porting_to.html

frameworks/base/media/libmedia/MediaScanner.cpp:84&90:

-char*

+const char*

五.

development/simulator/app/DeviceManager.cpp:8: fatal error: wx/wxprec.h: No such file or directory
compilation terminated.
development/simulator/app/DeviceWindow.cpp:8: fatal error: wx/wxprec.h: No such file or directorymake: *** [out/host/linux-x86/obj/EXECUTABLES/simulator_intermediates/DeviceManager.o] Error 1

ubuntu13.04无法支持libwxgkt2.6-dev 所以需要安装高版本的wx2.8

解决办法:

apt-file search wxprec.h

sudo apt-get install wx2.8
wx-config --cflags

六.同步内部环境

. build/envsetup.sh
lunch

    Lunch menu... pick a combo:
     1. generic-eng
     2. simulator
     3. full_passion-userdebug
     4. full_crespo-userdebug

choose 2

make -j4



转自:http://blog.csdn.net/xiaominghimi/article/details/7637530

本篇介绍在Cocos2dx中加入网络通信相关代码,然后编译到Android时出现的一些细节和需要注意的地方总结。不多废话了,直接进入正题;

   1.  首先介绍在Cocos2dx中使用pthread编译时应注意:

由于NDK明确指明不支持 pthread_cancel() 函数,编译的错误提示如下:

解决方案:

使用 pthread_kill()  或者 return NULL; 两种方法进行解决。

其中的区别如下:

pthread_exit() : 可以指定返回值,以便其他线程通过 pthread_join()   函数获取该线程的返回值;

return:  在线程函数中使用 return,会退出线程;

这里Himi推荐使用 return ,直接 return NULL;

 

 

  2. 编译提示找不到 sockaddr_in   与 htons等定义,错误提示如下:

出现此类问题,主要是头文件没有加入,虽然在ios编译环境不抱错,但是编译会出现此问题。

 解决方案:

在使用这些函数的类中,加入如下两个头文件:

  1. #include "netdb.h"  
  2. #include "netinet/in.h"  


3. Curl.h 头文件找不到注意,这里是编译出现头文件找不到的问题,如果你是xcode编译找不到头文件请参考如下博文:(这里讲解的是在ndk编译android过程中出现此类问题的解决办法

【C/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件找不到问题)

先观察错误的日志:

解决方案:

在你使用curl的类中,虽然导入了curl类,那么你肯定是include “curl/curl.h”导入的吧!OK,改变如下即可,指定到完整相对路径即可:

  1. "../../libs/cocos2dx/platform/third_party/ios/curl/curl.h"  

4. 有时候编译报错,错误提示说 curl_global_init 、curl_easy_init、curl_easy_setopt等没有定义undefined !这个问题是因为没有加入curl关联lib包;错误提示如下:

    解决方案:

修改jni下的helloworld下的.mk文件,整个路径如下:

your project//android/jni/helloworld/Android.mk

打开整个mk文件,找到如下内容:

修改成如下内容:

其实就是添加了两句话!但是要注意!

你仔细看添加的第一句下面一句中间的符号,之前是 “  :=  ”现在是 “+=”  一定要注意,这个问题困扰Himi好几个小时 = =。

 OK,基本这些足够解决问题的啦~


Fixed itk-3.20.1 on gcc-4.8, error: ‘memcpy’ was not declared in this scope

实践证明InsightToolkit-3.20.1.tar.gz在Ubuntu 12.04,64bit,gcc 4.8/gcc 4.7版本上编译都会报同一个错误“‘memcpy’ was not de...
  • arackethis
  • arackethis
  • 2014年12月30日 20:59
  • 1744

如何解决ios SIGPIPE 导致的崩溃

在开发ios长连接游戏的过程中遇到一个问题:在游戏运行过程中玩家按下home键或者其他原因游戏被挂起,socket连接不会断开,服务器为了节省资源,在一段时间后会主动关闭这个连接。当玩家再次切回到游戏...
  • ring0hx
  • ring0hx
  • 2014年06月06日 16:00
  • 9624

移植android ndk c++各种兼容性问题

__int64找不到符号 采用int64_t来代替: #if defined(__ANDROID__) typedef int64_t __int64; #endif ...
  • yangguangmeng
  • yangguangmeng
  • 2014年04月30日 14:23
  • 1207

解决Android下getifaddrs和freeifaddrs undefined reference 的问题

  • 2015年09月10日 20:53
  • 6KB
  • 下载

Android--移植android ndk c++各种兼容性问题

Android--移植android ndk c++各种兼容性问题
  • Trent1985
  • Trent1985
  • 2016年05月09日 17:37
  • 2787

android下无法使用getifaddrs的问题

  • 2017年06月17日 11:19
  • 6KB
  • 下载

ndk编译错误:error: 'nullptr' was not declared in this scope

nullptr是C++11引入的新特性,解决C和C++中NULL的定义不一致所带来的编译器兼容问题。C中NULL是指向0地址的指针(void *)0,c++中则是定义为整数0.       ndk中...
  • harry_helei
  • harry_helei
  • 2015年03月19日 11:02
  • 12300

xxx.c:4: fatal error: xxx.h: No such file or directory

我在交差编译的时候经常碰到类似这样的问题: xxx.c:4: fatal error: xxx.h: No such file or directory 注:这里的xxx是一个一般的表述。 在Ma...
  • sonbai
  • sonbai
  • 2014年01月22日 13:18
  • 6741

编译Android 4.0.3的常见错误

以下是编译Android 4.0.3的常见错误,这些错误的解决办法收录自互联网。 Google group有个专门的Android Building组,有兴趣的可以加入。 有转载这里的也有...
  • liukun321
  • liukun321
  • 2014年03月02日 21:51
  • 5757

使用NDK编译的时候出现 undefined reference to

原文地址:http://blog.sina.com.cn/s/blog_5be1061c0100ykim.html 最近一段时间在使用NDK进行编译的时候一直出现undefined referenc...
  • whuancai
  • whuancai
  • 2014年05月27日 12:40
  • 5312
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ndk 编译 c++ 兼容性问题汇总整理
举报原因:
原因补充:

(最多只允许输入30个字)