我正在尝试编译一些关于UNIX scokets程序的源代码,在Linux上我没有问题,但在macOS上我遇到了类型定义问题。我不知道我能在这里放多少细节,但我会尝试。
需要编译的源码如下:
errlib.c
errlib.h
server_test.c
sockwrap.c
sockwrap.hserver_test.c中main所在的位置。
为了编译,我使用:
gcc -Wall -DTRACE -o server_test server_test.c errlib.c sockwrap.c在Linux上运行这个没有问题,但在macOS上我得到了20多个错误,所有这些都是关于(也许)缺少bool_t的定义。我认为在macOS内部库中的/usr/include/rpc/*文件中有一些不起作用的东西。
因此,我查看了/usr/include/rpc/xdr.h中是否包含了<sys/types.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获得源代码。
可能的问题是什么?
发布于 2017-07-10 02:24:17
糟糕的答案
只需在server_test.c源代码中包含<rpc/types.h>即可解决此问题,如下所示:
#include <rpc/types.h>更好的那个
这是上面的一个解决方案,仅对此server_test.c实现有效。
如果您希望“全局”修复此问题,可以执行以下步骤:
禁用SIP (how to?here)
xdr.h )(从这里开始,在别处复制两次:一个副本用于备份和修改,另一个副本只需添加所需的include (在/usr/include/rpc/
中查看图片here)
xdr.h #include <rpc/types.h>yourxdr.h in the original #include <rpc/types.h>下面是我是如何做到的:

https://stackoverflow.com/questions/44999407
复制相似问题