〖Linux〗Qt5.2.0+gsoapがAndroidを開発したNDKプログラムにエラーが発生した場合の解決

4978 ワード

1.  error: cannot convert ‘int*’ to ‘hostent**’ for argument ‘5’ to..
原因分析:
マクロ定義が欠けているため、誤った関数プロトタイプが使用されています.
呼び出された関数は次のとおりです.
  gethostbyname_r(addr,&hostent,soap->buf,SOAP_BUFLEN,&soap->errnum)
正しい呼び出し関数は次のとおりです.
  gethostbyname_r(addr,&hostent,soap->buf,SOAP_BUFLEN,&host,&soap->errnum)
解決方法:
1)ファイルstdsoap 2を修正する.h,次のセグメント(約837行の位置)が見つかった.
/* Portability: define SOAP_SOCKLEN_T */
#if defined(_AIX) || defined(AIX)
# if defined(_AIX43)
#  define SOAP_SOCKLEN_T socklen_t
# else
#  define SOAP_SOCKLEN_T int
# endif
#elif defined(SOCKLEN_T)
# define SOAP_SOCKLEN_T SOCKLEN_T
#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390)
# define SOAP_SOCKLEN_T socklen_t
#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) || defined(HP_UX)
# define SOAP_SOCKLEN_T int
#else
# define SOAP_SOCKLEN_T size_t
#endif

次のように変更します.
/* Portability: define SOAP_SOCKLEN_T */
#if defined(_AIX) || defined(AIX)
# if defined(_AIX43)
#  define SOAP_SOCKLEN_T socklen_t
# else
#  define SOAP_SOCKLEN_T int
# endif
#elif defined(SOCKLEN_T)
# define SOAP_SOCKLEN_T SOCKLEN_T
#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390) || defined(__ANDROID__)
# define SOAP_SOCKLEN_T socklen_t
#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) || defined(HP_UX)
# define SOAP_SOCKLEN_T int
#else
# define SOAP_SOCKLEN_T size_t
#endif

2)ファイルstdsoap 2を修正する.cppは、次のセグメント(約3698行の位置)を見つけます.
#if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__)))
  if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
    host = NULL;

次のように変更します.
#if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) || defined(__ANDROID__)
  if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
    host = NULL;

 
2. Cannot find Android tool: "/opt/android/sdk/tools/android"
原因分析:
QtはデフォルトのAndroid SDKディレクトリを検索し、新しいパスを指定してもこのエラーを報告する可能性があります.
解決策:
インストールされているAndroid SDKディレクトリが/media/Source/android-sdk-linuxであると仮定し、端末にコマンドを入力
  sudo mkdir -p /opt/android
  sudo ln -s /media/Source/android-sdk-linux /opt/android/sdk