NDK编译php,Android 下NDK 编译 Glib 时报的错

(1) locale.h 文件不同

#include

C语言支持本地化设定,如本地格式时间和货币符号

C格式是最小化的设定格式,在所有的系统和编译器中有通用的相同设定,因此使用这种格式编写的程序是可预测的。是所有C语言程序默认使用的格式。

系统的默认格式使用空字符串””格式。当程序运行时,环境提供默认的本地化配置,通常包含比C格式的更多的本地化信息。

头文件中定义lconv类型,函数setlocale和localeconv,结合一些宏,定义本地特定信息。

注意本地配置信息影响这标准C函数库中的很多函数的行为:

或,字符转换规则影响strcoll和strxfrm函数

或,扩展字符集选择影响了isdigit和isxdigit函数以外,其他函数

或,字符转换规则影响格式化的输入/输出操作和小数点字符集影响数字格式化

或,时间的本地化格式影响strftime函数

一些本地化信息能够更好的渲染程序的输出。

头文件中的结构类型:

lconv:数值的格式化信息

头文件中提供了一些函数

setlocale:设置或恢复本地化信息

localeconv:获得本定格式化信息 返回lconv结构指针

lconv结构介绍

保存格式化的数值信息,保存数值包括货币和非货币的格式化信息,localeconv返回指向该对象的指针,以下为结构中的成员及信息:

char

*decimal_point; char

*thousands_sep; char *grouping; char

*int_curr_symbol; char

*currency_symbol; char *mon_decimal_point; char *mon_thousands_sep; char

*mon_grouping; char

*positive_sign; char

*negative_sign; char

int_frac_digits; char

frac_digits; char

p_cs_precedes; char

p_sep_by_space; char

n_cs_precedes; char

n_sep_by_space; char

p_sign_posn; char

n_sign_posn; 函数:

struct lconv * localeconv(void)

返回指向当前lconv对象的指针,包含本地化信息

char * setlocale(int category,const char * locale);

设定或恢复本地化配置

很多运行环境包含着用户的本地化信息,独立于系统之外,所有的C程序采用C本地化格式,为了使用本地环境的配置信息,调用该函数,采用“”为函数参数。

C的本地化格式的设定形式为:setlocale(LC_ALL,”C”)

默认的本地化格式:setlocale(LC_ALL,””);

参数:

category:以下参数为定义在中的宏

名称

影响部分

LC_ALL

全部本地化信息

LC_COLLATE

影响strcoll和strxfrm

LC_CTYPE

影响字符处理函数和多行字符处理函数

LC_MONETRAY

影响localeconv返回的货币格式化信息

LC_NUMERIC

影响格式化输入输出字符中的小数点符号

LC_TIME

影响strftime函数

Locale:

若为“C”,则为C本地化方式,若为“”,则采用当前环境下的默认本地化格式

参考:http://www.cplusplus.com/reference/clibrary/clocale/

http://edu.codepub.com/2009/1023/16664.php

以下为 Android NDK 编译 Glib

时报的错误:gstrfuncs.c: In function 'g_ascii_strtod':

gstrfuncs.c:710:30: error: 'struct lconv' has no member named

'decimal_point' gstrfuncs.c: In function 'g_ascii_formatd':

gstrfuncs.c:934:30: error: 'struct lconv' has no member named

'decimal_point'

make[4]: *** [gstrfuncs.lo] Error 1

make[4]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'

make[3]: *** [all-recursive] Error 1

make[3]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'

make[2]: *** [all] Error 2

make[2]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4'

make: *** [all] Error 2

yujinhe@ubuntu:~/projects/NDK/jni/glib-2.32.4$

以下为 Android 平台同名头文件定义:

yujinhe@ubuntu:~$ cat

/opt/my-android-toolchain/sysroot/usr/include/locale.h

#ifndef _LOCALE_H_

#define _LOCALE_H_

#include

__BEGIN_DECLS

enum {

LC_CTYPE = 0,

LC_NUMERIC = 1,

LC_TIME = 2,

LC_COLLATE = 3,

LC_MONETARY = 4,

LC_MESSAGES = 5,

LC_ALL = 6,

LC_PAPER = 7,

LC_NAME = 8,

LC_ADDRESS = 9,

LC_TELEPHONE = 10,

LC_MEASUREMENT = 11,

LC_IDENTIFICATION = 12

};

extern char *setlocale(int category, const char *locale);

#if 1

struct lconv { };

struct lconv *localeconv(void);

#endif

__END_DECLS

(2) pwd.h 文件不同

以下部分转自: http://blog.sina.com.cn/s/blog_515b90d00100or26.html

******************************************************************

[转载] 关于passwd结构相关 (2011-01-19 20:55:09)

在头文件/usr/include/pwd.h中,

struct passwd

{

char *

pw_name; char *

pw_passwd; __uid_t

pw_uid; __gid_t

pw_gid; char *

pw_gecos; char *

pw_dir; char *

pw_shell; };

--------------------------------------------------------------------------------

当您需要取得有关某个使用者的资讯时,大致上有以下几个函数可以使用:

--------------------------------------------------------------------------------

struct passwd * getpwuid(uid_t uid);

当您知道使用者的uid(user id)时,可以透过getpwuid来得知所有关於该使用者的相关资讯。

--------------------------------------------------------------------------------

struct passwd * getpwnam(char * name);

当您知道使用者名称时,可以透过getpwnam来得知所有关於该使用者的相关资讯。

--------------------------------------------------------------------------------

int getpw(uid_t uid, char *buf);

当您仅需要取得使用者的密码进行比对时,可以使用getpw。

--------------------------------------------------------------------------------

另外,有存取一系列使用者资讯的方法。

--------------------------------------------------------------------------------

FILE * pwdopen(void);

开启password档案。

--------------------------------------------------------------------------------

struct passwd * pwdread(FILE * stream,struct passwd *p);

读取一个使用者资讯进来,填到p中,返回p为成功,NULL为失败。

--------------------------------------------------------------------------------

void setpwent(void);

将读取资料流重设到起点。

--------------------------------------------------------------------------------

void endpwent(void);

关闭password档案资料流。

--------------------------------------------------------------------------------

struct passwd * getpwent(void);

读取一个使用者资讯进来,有必要的话,则将进行开档动作。

--------------------------------------------------------------------------------

struct passwd * fgetpwent(FILE * stream);

从档案中读取一个使用者资讯进来。

--------------------------------------------------------------------------------

int putpwent(struct passwd *p,FILE *f);

将一个使用者资讯写入档案中。

--------------------------------------------------------------------------------

struct passwd * pwdalloc(void);

******************************************************************

以下为 Android NDK 编译 Glib 时报的错误:

gutils.c: In function 'g_get_any_init_do':

gutils.c:832:2: warning: implicit declaration of function

'setpwent' [-Wimplicit-function-declaration]

gutils.c:840:8: error: 'struct passwd' has no member named

'pw_gecos'

gutils.c:840:25: error: 'struct passwd' has no member named

'pw_gecos'

gutils.c:846:35: error: 'struct passwd' has no member named

'pw_gecos'

gutils.c:749:12: warning: unused variable 'logname'

[-Wunused-variable]

gutils.c:748:10: warning: unused variable 'error'

[-Wunused-variable]

make[4]: *** [gutils.lo] Error 1

make[4]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'

make[3]: *** [all-recursive] Error 1

make[3]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'

make[2]: *** [all] Error 2

make[2]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory

`/home/yujinhe/projects/NDK/jni/glib-2.32.4'

make: *** [all] Error 2

以下为 Android 平台同名头文件定义:

cat

/opt/my-android-toolchain/sysroot/usr/include/pwd.h

#ifndef _PWD_H_

#define _PWD_H_

#include

#include

#define

_PATH_PASSWD "/etc/passwd"

#define _PATH_MASTERPASSWD "/etc/master.passwd"

#define _PATH_MASTERPASSWD_LOCK "/etc/ptmp"

#define _PATH_PASSWD_CONF "/etc/passwd.conf"

#define

_PATH_PASSWDCONF _PATH_PASSWD_CONF #define _PATH_USERMGMT_CONF "/etc/usermgmt.conf"

#define

_PATH_MP_DB "/etc/pwd.db"

#define

_PATH_SMP_DB "/etc/spwd.db"

#define

_PATH_PWD_MKDB "/usr/sbin/pwd_mkdb"

#define

_PW_KEYBYNAME '1'

#define

_PW_KEYBYNUM '2'

#define

_PW_KEYBYUID '3'

#define

_PASSWORD_EFMT1 '_'

#define

_PASSWORD_NONDES '$'

#define

_PASSWORD_LEN 128

#define

_PASSWORD_NOUID 0x01 #define

_PASSWORD_NOGID 0x02 #define

_PASSWORD_NOCHG 0x04 #define

_PASSWORD_NOEXP 0x08

#define

_PASSWORD_OLDFMT 0x10 #define

_PASSWORD_NOWARN 0x20

#define _PASSWORD_WARNDAYS 14 #define

_PASSWORD_CHGNOW -1

struct passwd

{

char*

pw_name;

char*

pw_passwd;

uid_t

pw_uid;

gid_t

pw_gid;

char*

pw_dir;

char*

pw_shell;

};

__BEGIN_DECLS

struct passwd* getpwnam(const char*);

struct passwd* getpwuid(uid_t);

void endpwent(void);

#if 0

int getpwnam_r(const char*, struct passwd*, char*, size_t, struct

passwd**);

int getpwuid_r(uid_t, struct passwd*, char*, size_t, struct

passwd**);

struct passwd* getpwent(void);

int setpwent(void);

#endif

__END_DECLS

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值