在macOS上编译XDR时遇到的问题(RPC types.h问题)

时间:2017-07-09 17:58:56

标签: c macos unix rpc xdr

我正在尝试编译一些关于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

可能是什么问题?

1 个答案:

答案 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

我是这样做的:

enter image description here