1

我正在尝试编译一些关于 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. /usr/include/rpc/*我想某些东西在 macOS 内部库中的文件中不起作用。

所以我寻找 if <sys/types.h>is included in /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);
...

和许多其他非常相似的行。

对于那些想要加深的人,可以在此处获得资源。

可能是什么问题呢?

4

1 回答 1

1

不好的答案

通过简单地包含<rpc/types.h>server_test.c源中解决的问题如下:

#include <rpc/types.h>

更好的一个

这是上面的一个解决方案,只对这个server_test.c实现有效。

如果要“全局”解决此问题,可以按照以下步骤操作:

  • 禁用 SIP(​​如何?这里

  • 获取您的 macOS xdr.h(从这里 /usr/include/rpc/xdr.h

  • 在别处复制两次:一份用于备份和修改另一份只需添加所需的包含(#include <rpc/types.h>见下图)

  • 将您的修改覆盖xdr.h到原来的/usr/include/rpc/

  • 重新启用 SIP

这是我的做法:

在此处输入图像描述

于 2017-07-09T18:24:17.307 回答