1

我有一个程序可以执行一些可以编译 32 位二进制文​​件的网络 IO

但是,当我在编译时设置 -m64 选项时,我得到以下相当神秘的错误

In file included from /usr/include/sys/stream.h:22,
             from /usr/include/netinet/in.h:62,
             from /usr/include/sys/socket.h:221,
             from operation_networkio.cc:15:
/usr/include/sys/vnode.h:241: error: overflow in array dimension
/usr/include/sys/vnode.h:241: error: size of array `pad' is too large

在我的程序中触发此错误的源代码 operation_networkio.cc 中的违规行似乎是

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

有人能告诉我我做错了什么以及如何解决这个问题吗?我在 Solaris sparc 上使用 GCC

4

2 回答 2

1

最终发现我在编译时启用了 -mfaster-structs 选项。

出于某种原因,删除此选项可以解决此构建问题。这会导致 64 位构建失败,尽管 32 位构建有效。如果有人能解释一下,我当然想知道为什么

于 2012-03-25T15:07:19.750 回答
0

这确实很奇怪。

http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/sys/vnode.h#286

这些数据结构不可能超过 64 字节。或者,也许您包含了一些重新定义这些数据结构的文件。要确定原因是什么,您应该查看 C 编译器的预处理输出。

g++ -E operation_networkio.cc -I... -D... -o preprocessed.cc

运行该命令后,您应该查看文件preprocessed.cc。搜索vn_vfslocks_entry并查看围绕该定义的代码是否符合您的预期。

于 2012-03-25T01:16:18.003 回答