HP-UX下gcc编译器报/usr/include/sys/ipc.h出错

醉梦书生 2006-07-07 05:43:23
系统环境为:
HP-UX INDEX01 B.11.23 U ia64 (ta)
gcc version 3.4.4编译器
源程序中的头文件包含顺序如下:
#include <errno.h>
#include <time.h>
#include <stdio.h>
#include <signal.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <sys/wait.h>
由于要用到共享内存和信号量,所以包含了上叙文件,结果编译器报错了,错误提示如下:

/usr/include/sys/ipc.h:51: error: parse error before "cid_t"
/usr/include/sys/ipc.h:56: error: parse error before '}' token
In file included from shmISIN.c:5:
/usr/include/sys/shm.h:82: error: field `shm_perm' has incomplete type
In file included from shmISIN.c:6:
/usr/include/sys/sem.h:91: error: field `sem_perm' has incomplete type

程序采用cc编译器是没有任何问题的,但是由于程序的其他模块必须采用gcc编译器,所以必须得解决这个问题,以前在使用信号量时也曾遇到这个问题,当时我是把#include <sys/sem.h>注释掉了就可以了,但是共享内存的那个注释掉就出现定义找不到的问题了。
现在项目时间紧急,哪位大侠能够帮我的,不胜感激!分数如果不够,还可以再加,先谢谢了!



...全文
860 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
醉梦书生 2006-07-18
  • 打赏
  • 举报
回复
呵呵,今天终于找到了真正的原因,yjf7888()()()()()()()() 说的没错,确实如此,我今天已经改过来了,采用的方法是在引用的前面加:#include "/usr/include/sys/types.h" 直接引用系统的头文件,而不是gcc的头文件
yjf7888 2006-07-17
  • 打赏
  • 举报
回复
可能是gcc优先使用gcc目录下的types.h(如/usr/local/lib/gcc/ia64-hp-hpux11.20/3.4.2/include/sys/types.h
), 而不是/usr/include/sys/types.h导致的这个问题,正确的解决办法是把
# ifndef _CMPTID_T
# define _CMPTID_T
typedef int32_t cid_t; /* For compartment IDs */
typedef cid_t cmpt_t;
# endif /* _CMPTID_T */
添加到gcc目录下的types.h里面。
yjf7888 2006-07-17
  • 打赏
  • 举报
回复
试试在用gcc编译的时候加上-D_XOPEN_SOURCE_EXTENDED或者-D_INCLUDE_POSIX_SOURCE
loveisbug 2006-07-17
  • 打赏
  • 举报
回复
恩,不错。
醉梦书生 2006-07-17
  • 打赏
  • 举报
回复
问题解决了,虽然用的方法很不好,但是总算解决了,这里把我解决的方法贴出来,供遇到和我同样问题的朋友参考:
1。将系统的sys/ipc.h文件拷出来,在该文件首添加:
# ifndef _CMPTID_T
# define _CMPTID_T
typedef int32_t cid_t; /* For compartment IDs */
typedef cid_t cmpt_t;
# endif /* _CMPTID_T */
该定义实际上是在系统文件sys/types.h中对cid_t数据类型的定义
2。 在你的文件中#include <shm.h>语句前面包含以上被修改的ipc.h,也就是让它代替系统的ipc.h文件中的定义
然后你就可以正常使用了,虽然这个方法是很不好的,有很多隐患,但是目前我也没有时间去研究了,各位大侠有谁找到更好的办法麻烦告诉我。
给大家提供一点思路:我看过types.h,在我用的那个系统中有一个bug修正的说明,将#ifdef _INCLUDE_POSIX_SOURCE语句注释掉了,该判断刚好就是在cid_t结构定义的外层判断,所以我怀疑系统开发人员已经发现了数据类型cid_t未定义的bug,但是他的那种处理方式却不能够彻底解决问题。我觉得还是系统的头文件定义判断出现了某重递归,而gcc对这种现象的处理恰好有一个bug,最终就是cc可以编译过去,而gcc就报系统文件错误。
ghtsao 2006-07-13
  • 打赏
  • 举报
回复
有时候,把头文件调换一下顺序就可以了。
醉梦书生 2006-07-12
  • 打赏
  • 举报
回复
这么多天过去了居然没有一个人回答~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
难道中国的unix水平真的就这么~~~~~~~~~~~~~~~~~
醉梦书生 2006-07-07
  • 打赏
  • 举报
回复
在线等~~~~~~~~~~~~~~~~~~~~

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧