cc1plus: error: include: значение слишком велико для определенного типа данных при компиляции с g ++ - PullRequest
24 голосов
/ 13 марта 2010

Я делаю проект, который должен компилироваться в Windows и Linux. Я сделал проект в Visual Studio, а затем сделал make-файл для Linux. Я создал все файлы в Windows с VS.

Он отлично компилируется и работает в VS, но когда я запускаю make-файл и запускаю 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. Я просто хотел убедиться, что все работает, прежде чем я начал разработку. Я пробовал искать, но безрезультатно.

Любая помощь будет оценена.

Ответы [ 5 ]

35 голосов
/ 23 марта 2010

Я нашел решение по крайней мере в Ubuntu. Я, как вы заметили, ошибка возникает только на смонтированных общих ресурсах samba - похоже, это происходит из-за g ++ 'stats' файла, индекс возвращает очень большое значение.

При монтировании общего ресурса добавьте nounix, noserverino к параметрам, например:

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

Я нашел информацию в http://bbs.archlinux.org/viewtopic.php?id=85999

2 голосов
/ 27 мая 2012

У меня была похожая проблема. Я скомпилировал проект в смонтированном CIFS-ресурсе Samba. С одним ядром Linux компиляция была выполнена, но с использованием другого ядра Linux (2.6.32.5) я получил похожее сообщение об ошибке: «Значение слишком велико для определенного типа данных». Когда я использовал предложенный вариант монтирования CIFS «nounix, noserverino», проблема была исправлена. Так что в этом случае возникает проблема с монтированием CIFS, поэтому сообщение об ошибке вводит в заблуждение, так как нет больших файлов.

1 голос
/ 23 марта 2010

Утилиты ядра GNU:

27 Значение слишком велико для определенного типа данных

Это означает, что ваша версия утилит не была скомпилирована с поддержка больших файлов включена. Утилиты GNU поддерживают большие файлы если они скомпилированы для этого. Вы можете скомпилировать их снова и убедитесь, что поддержка больших файлов включена. Эта поддержка автоматически настраивается autoconf на большинстве систем. Но это Возможно, что в вашей конкретной системе не может определить, как сделать это, и поэтому autoconf пришел к выводу, что ваша система не поддержка больших файлов.

Сообщение «Значение слишком велико для определенного типа данных» является системной ошибкой сообщение об ошибке при попытке выполнить операцию с большим файлом с использованием тип данных небольшого файла. Большие файлы определяются как что-либо большее чем 32-разрядное целое число со знаком или, иначе говоря, больше 2 ГБ.

Многие системные вызовы, которые имеют дело с файлами, возвращают значения в «длинном целом» тип данных. На 32-битном оборудовании long int является 32-битным, и поэтому накладывает ограничение в 2 ГБ на размер файлов. Когда это было изобретено, что было ОГРОМНО, и было трудно представить, что ему нужно что-то такое большое. Время прошло, и файлы могут быть намного больше сегодня. На родной 64-битной В системах ограничение размера файла обычно составляет 2 ГБ * 2 ГБ. Что мы будем снова думаю, огромный.

В 32-битной системе с 32-битным "длинным целым" вы обнаружите, что не можете сделать его больше, а также поддерживать совместимость с предыдущими программы. Изменение этого сломало бы много вещей! Но многие системы делают можно переключиться в новый режим программы, который переписывает все файловые операции в 64-битной программной модели. Вместо "длинных" они используют новый тип данных с именем "off_t", который создан, чтобы быть 64-битный размер. Исходный код программы должен быть написан для использования off_t тип данных вместо длинного типа данных. Обычно это делается определение -D_FILE_OFFSET_BITS = 64 или что-то подобное. Это зависит от системы. После завершения и переключения в этот новый режим большинство программ поддержка больших файлов просто отлично.

См. Следующий вопрос, если вы случайно создали большой файл и теперь нужен какой-то способ справиться с этим.

0 голосов
/ 30 мая 2018

Если вы используете mergerfs файловую систему, удаление опции use_ino решит проблему: https://github.com/trapexit/mergerfs/issues/485

0 голосов
/ 13 марта 2010

Я думаю, что ваши параметры g ++ немного не совпадают или конфликтуют.

-c только компиляция
-I каталог ваших включений (простое включение может быть неоднозначным. Попробуйте полный путь)
-o outfile (но -c говорит только о компиляции)

...