我正在尝试编译一些关于UNIX scokets程序的源代码,在Linux上我没有问题但是在macOS上我遇到了类型定义问题。我不知道我可以在这里放多少细节,但我会尝试。
要编译的源代码是:
errlib.c
errlib.h
server_test.c
sockwrap.c
sockwrap.h
main
位于server_test.c
。
要编译我使用:
gcc -Wall -DTRACE -o server_test server_test.c errlib.c sockwrap.c
在Linux上运行这个没有问题,但是在macOS上我得到的错误超过20个,并且所有这些都是关于bool_t
的(perhaphs)缺失定义。我想在macOS内部库中的/usr/include/rpc/*
文件中不起作用。
所以我查找<sys/types.h>
中是否包含/usr/include/rpc/xdr.h
,似乎并未遗漏。
gcc
输出的一些第一行是:
In file included from server_test.c:16:
/usr/include/rpc/xdr.h:126:3: error: type name requires a specifier or qualifier
bool_t (*x_getlong)(struct __rpc_xdr *, int *);
^
/usr/include/rpc/xdr.h:126:10: error: function cannot return function type 'int (struct __rpc_xdr *, int *)'
bool_t (*x_getlong)(struct __rpc_xdr *, int *);
^
/usr/include/rpc/xdr.h:128:3: error: type name requires a specifier or qualifier
bool_t (*x_putlong)(struct __rpc_xdr *, const int *);
^
/usr/include/rpc/xdr.h:128:10: error: function cannot return function type 'int (struct __rpc_xdr *, const int *)'
bool_t (*x_putlong)(struct __rpc_xdr *, const int *);
^
/usr/include/rpc/xdr.h:128:3: error: duplicate member 'bool_t'
bool_t (*x_putlong)(struct __rpc_xdr *, const int *);
^
/usr/include/rpc/xdr.h:126:3: note: previous declaration is here
bool_t (*x_getlong)(struct __rpc_xdr *, int *);
^
/usr/include/rpc/xdr.h:136:3: error: type name requires a specifier or qualifier
bool_t (*x_getbytes)(struct __rpc_xdr *, char *, unsigned int);
...
和许多其他非常相似的行。
对于那些想要深化的人来说,可以使用here。
可能是什么问题?
答案 0 :(得分:0)
只需在<rpc/types.h>
来源中加入server_test.c
,即可解决问题:
#include <rpc/types.h>
以上解决方案仅对此server_test.c
实施有效。
如果您想修复此问题“global”,您可以按照以下步骤操作:
禁用SIP(如何?here)
获取您的macOS xdr.h
(来自此处/usr/include/rpc/xdr.h
)
将其复制到其他地方两次:一个副本用于备份,另一个副本只需添加所需的包含(#include <rpc/types.h>
并查看下面的图片)
将修改后的xdr.h
覆盖在/usr/include/rpc/
重新启用SIP
我是这样做的: