cc1plus:error:include:使用g ++编译时,对于定义的数据类型,值太大

问题描述 投票:24回答:5

我正在制作一个应该在Windows和Linux上编译的项目。我在Visual Studio中创建了项目,然后为linux创建了一个makefile。我使用VS在Windows中创建了所有文件。

它在VS中编译并运行完美,但是当我运行makefile并运行g ++时,我得到了

$ g++ -c -I include -o obj/Linux_x86/Server.obj src/Server.cpp
cc1plus: error: include: Value too large for defined data type
cc1plus: error: src/Server.cpp: Value too large for defined data type

代码只不过是一个Hello World atm。我只是想在开始开发之前确保一切正常。我试过搜索但无济于事。

任何帮助,将不胜感激。

visual-studio g++
5个回答
35
投票

我至少在Ubuntu上找到了解决方案。我,就像你已经注意到错误只发生在已安装的samba共享上 - 它似乎来自g ++'stat'ing文件,inode返回一个非常大的值。

将share add,nounix,noserverino挂载到选项时,即:

mount -t cifs -o user=me,pass=secret,nounix,noserverino //server/share /mount

我在http://bbs.archlinux.org/viewtopic.php?id=85999找到了这些信息


2
投票

我有类似的问题。我在CIFS挂载的samba共享中编译了一个项目。使用一个Linux内核编译完成,但使用其他Linux内核(2.6.32.5),我得到类似的错误消息:“对于定义的数据类型,值太大”。当我使用提出的“nounix,noserverino”CIFS安装选项时,问题得到了解决。因此,在这种情况下,CIFS安装存在问题,因此错误消息具有误导性,因为没有大文件。


1
投票

GNU Core Utils:

27对于定义的数据类型,值太大

这意味着您的实用程序版本未在启用大文件支持的情况下编译。如果编译它们,GNU实用程序确实支持大文件。您可能希望再次编译它们并确保启用了大文件支持。在大多数系统上,autoconf会自动配置此支持。但有可能在您的特定系统上无法确定如何执行此操作,因此autoconf得出结论,您的系统不支持大文件。

消息“对于已定义的数据类型而言值太大”是在使用非大型文件数据类型尝试对大文件执行操作时报告的系统错误消息。大文件被定义为大于带符号的32位整数的任何大小,或者以不同的方式表示,大于2GB。

许多处理文件的系统调用都以“long int”数据类型返回值。在32位硬件上,long int是32位,因此这会对文件大小施加2GB的限制。当这被发明是巨大的,并且很难想象需要任何大的东西。时间已经过去,今天的文件可能会大得多。在本机64位系统上,文件大小限制通常为2GB * 2GB。我们将再次认为这是巨大的。

在具有32位“long int”的32位系统上,您会发现无法使其更大,并且与以前的程序保持兼容。改变这会打破很多东西!但是许多系统可以切换到新的程序模式,该模式将所有文件操作重写为64位程序模型。他们使用称为“off_t”的新数据类型而不是“long”,它被构造为64位大小。必须编写程序源代码才能使用off_t数据类型而不是long数据类型。这通常通过定义-D_FILE_OFFSET_BITS = 64或其他一些来完成。它取决于系统。完成后,一旦切换到这种新模式,大多数程序都会支持大文件。

如果您无意中创建了一个大文件,现在需要一些方法来处理它,请参阅下一个问题。


0
投票

如果你在mergerfs文件系统上,删除use_ino选项将解决问题:https://github.com/trapexit/mergerfs/issues/485


-1
投票

我认为你的g ++参数有点过时或者有点冲突。

-c只编译 你的include的目录(只是普通的包含可能含糊不清。试试完整路径) -o outfile(但-c表示只编译)

© www.soinside.com 2019 - 2024. All rights reserved.