Ошибка c1128 число секций превышает предел формата объектного файла компилировать с bigobj

Обновлено: 07.07.2024

В решениях запрещается:

Решения выполняются в специальном окружении, обеспечивающем безопасный запуск, и попытка выполнить какие-либо из указанных действий закончится, скорее всего, получением вердикта «Ошибка во время выполнения».

Ввод и вывод данных

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

Можно считать, что изначально при запуске решения выходной файл будет отсутствовать, и решение должно его создать и записать туда ответ.

Внимательно проверяйте имена файлов в решениях на соответствие условию задачи.

Если в коде решения имена файлов указаны неверно, это может приводить к непредсказуемым последствиям. Так, если имя выходного файла указано неверно и требуемый по условию файл не создаётся, система, скорее всего, выдаст вердикт «Ошибка представления». В случае, когда в решении на Java перепутано имя входного файла и делается попытка открыть несуществующий файл, выбрасывается исключение. Если автор решения не перехватывает его, программа завершается с вердиктом «Ошибка во время выполнения». Если же исключение обрабатывается, то вполне возможны и другие вердикты в зависимости от того, отработает ли программа и что окажется в выходном файле. Если в решении на C++ неправильно указан входной файл и ошибки специально не обрабатываются, чтение из файла может приводить к чтению произвольных данных («мусора»). Если в программе вместо чтения из файла делается попытка считать данные со стандартного ввода (stdin, который обычно связан с клавиатурой консоли), программа заблокируется («повиснет») в ожидании ввода и будет завершена с вердиктом «Превышен предел времени».

Решение может выводить произвольные данные «в консоль», то есть в стандартные потоки stdout, stderr, которые обычно связаны с консольным окном (например для отладки). Это не запрещается и не влияет на результат. Проверяется только содержимое выходного файла. Следует помнить, что на вывод тратится дополнительное время, поэтому большой объём отладочной информации может критически замедлить вашу программу. Вывод в stderr медленнее, чем в stdout, поскольку не буферизируется.

Тестирование решений

Каждое отправленное решение проходит на сервере проверку на нескольких тестах. Задача считается решённой только в случае прохождения всех тестов. Решение запускается на всех тестах, которые есть по задаче, и процесс тестирования не прерывается на первом непройденном тесте, как это делается в соревнованиях типа ACM.

Тесты по каждой задаче не упорядочены по сложности, по размеру входных данных, по какому-то иному критерию, а следуют в исторически сложившемся порядке их добавления в систему.

Не гарантируется, что первый тест в системе будет совпадать с тестом из условия (зачастую это не так).

CE — Ошибка компиляции (Compilation Error)

Не удалось скомпилировать решение и получить исполняемый файл для запуска. Решение в таком случае, очевидно, не может быть проверено ни на одном тесте.

Время работы компилятора ограничено 30 секундами. Если он не успел отработать по каким-либо причинам, также будет выставлен вердикт «Ошибка компиляции».

TLE — Нарушен предел времени (Time Limit Exceeded)

Для каждого теста установлено своё ограничение по времени (Time Limit) в секундах. Для разных тестов по одной задаче ограничение по времени может быть разным.

Тестирующая система учитывает так называемое процессорное время (CPU Time) выполнения процесса в операционной системе. Нет смысла делать решение задачи многопоточным, потому что распараллеливание хоть и позволяет сократить реальное время работы (Wall Time), но не уменьшает процессорное время.

Процесс-решение запускается на тесте, и если процесс не успевает завершиться в течение отведённого времени, он принудительно завершается и выставляется вердикт «Нарушен предел времени». В качестве времени работы решения на тесте указывается то время, которое процесс фактически проработал до того, как был приостановлен. Нет возможности узнать, сколько бы программа проработала, если бы не была снята по времени. Если при ограничении по времени на тест в 1 секунду вы видите, что решение получает вердикт «Нарушен предел времени» и работает 1015 мс, то нельзя это понимать как «решение чуть-чуть не успевает, надо ускорить его на 15 мс». Если решение останавливается по времени, то вывод программы никак не проверяется на предмет его правильности.

Возможные причины появления ошибки «Нарушен предел времени»:

Не рекомендуется «пропихивать» медленное решение, отправляя его многократно, пока система не «согласится» его принять. Решение в любой момент может быть перетестировано и, соответственно, может перестать быть принятым из-за нарушения предела времени.

ILE — Нарушен предел ожидания (Idleness Limit Exceeded)

Программа зависла в ожидании, не потребляя при этом ресурсы процессора.

Такое может быть, например, если согласно условию чтение входных данных осуществляется из файла, а решение выполняет ввод с консоли. В этом случае процесс решения заблокируется в ожидании нажатия клавиш на клавиатуре. Через некоторое время система тестирования принудительно завершит этот процесс и выставит вердикт ILE.

MLE — Нарушен предел памяти (Memory Limit Exceeded)

Ограничение по памяти есть не для всех задач. Гарантируется, что для всех тестов в рамках одной задачи ограничение по памяти одинаково.

Как и в случае нарушения ограничения по времени, программа при нарушении ограничения по памяти аварийно завершается тестирующей системой, её вывод не проверяется на правильность. Точно так же не следует воспринимать размер памяти, использованной до момента аварийного завершения, как объём, которого решению хватило бы для успешной работы. Более точно, вердикт MLE, полученный с использованием 257 МБ памяти, говорит о том, что приложение успело использовать 257 МБ памяти и было принудительно остановлено, но ничего не говорит о том, сколько памяти использовало бы приложение, не будучи принудительно остановленным.

RTE — Ошибка во время выполнения (Run-time Error)

Укажем типичные причины ошибок во время выполнения.

PE — Ошибка представления (Presentation Error)

Наиболее частая причина возникновения этой ошибки — не найден выходной файл. Возможно, вы забыли создать выходной файл и выводите ответ в консоль (он в таком случае игнорируется). Проверьте имена входного и выходного файла в вашей программе на соответствие условию задачи. Исторически сложилось, что в разных задачах входной и выходной файл именуются по разным правилам: input.txt и output.txt, in.txt и out.txt, input.in и output.out (обратите внимание, что нет расширения txt), [задача].in и [задача].out.

Также имейте в виду, что отлавливание исключений и других ошибок не должно быть самоцелью. Если исключение не обрабатывается каким-либо образом, обычно нет смысла его ловить по следующей причине. Аварийное завершение работы программы в результате ошибки во время выполнения приводит к вердикту «Ошибка во время выполнения», только если соответствующее исключение было «проброшено» наружу, а не «заглушено» на каком-то этапе. Если исключение отлавливается, но никак не обрабатывается, то в результате возникновения соответствующей ошибки следует ожидать вердикт «Ошибка представления» или же «Неправильный ответ» (реже).

WA — Неправильный ответ (Wrong Answer)

Для многих задач ответ однозначен, и проверяется просто побайтовое совпадение вашего выходного файла и сохранённого правильного ответа. Такая проверка требует строгого соблюдения формата файла, не допускает незначащих пробелов и пустых строк. Например, если правильный ответ имеет вид (пробелы обозначены символом ␣)

и решение вывело

(лишний пробел в конце второй строки), то будет получен вердикт «Неправильный ответ». Для некоторых задач написаны проверяющие программы (checker), которые к таким различиям лояльны и засчитывают ответы с лишними пробелами как правильные. Всегда точно следуйте формату файла и не выводите лишних пробелов, и проблем не будет.

После последней строки файла можно выводить или не выводить перевод строки — не важно. Есть две точки зрения в зависимости от того, с какой стороны смотреть на символ перевода строки:

  1. каждая строка завершается переводом строки, поэтому \n в конце файла нужен;
  2. перевод строки является разделителем между соседними строками, поэтому \n в конце файла не нужен.

Поэтому рекомендуется придерживаться первого подхода и завершать все строки переводами строк.

Другие очевидные причины получения неправильного ответа:

  • неверный алгоритм;
  • ошибка в программе.

Бывает такое, что решение от запуска к запуску даёт разные ответы, или же правильно работает на одном компьютере и неправильно на другом. Такие случаи, как правило, связаны с ошибками в решениях.

OK — Принято (Accepted)

Программа работает правильно и прошла все тесты с соблюдением всех ограничений.

Если решение принято системой, это ещё не означает, что в его основе лежит правильный алгоритм. В любой момент могут появиться новые наборы входных данных, на которых будут заново протестированы все решения по задаче. Если ваше решение на самом деле не полностью верно и прошло только из-за недостаточно сильного набора тестов, оно может в будущем потерять статус «Принято».

CF — Ошибка тестирования (Check Failed)

Если указан номер теста, то программа успешно завершается на предложенном тесте (укладывается в отведённые время и память и не совершает ошибок во время выполнения), но результат не удаётся проверить из-за ошибок в программе проверки. Вашей ошибки в этом случае, возможно, никакой нет и после исправления программы проверки будет получен вердикт OK. Не исключены ещё два варианта: WA, PE.

Имейте в виду, что если ошибка тестирования возникает на первом же тесте, то на остальных Ваше решение не запускается вовсе. Соответственно, в этом случае после устранения ошибок программы проверки вердикты TLE, MLE, RTE также могут возникнуть в любом тесте, кроме первого.

SV — Нарушение безопасности (Security Violation)

Ошибка означает, что программа попыталась выполнить запрещённые действия.

К их числу относится попытка создания новых процессов. Вашим решениям запрещено запускать на выполнение другие программы. Например, в коде

порождается новый процесс командной оболочки cmd.exe и в нём выполняется команда pause. Пожалуйста, не пишите так, для достижения аналогичного эффекта можно использовать другие приёмы.

Особенности языков программирования

У каждого конкретного языка программирования есть свои особенности, о которых полезно знать. Далее рассмотрены отдельные особенности написания решений на разных языках программирования:

Выбор языка программирования

Конфигурация тестирующего сервера

Сервер, на котором осуществляется запуск решений, является виртуальной машиной, выполняющейся внутри Microsoft Hyper-V Server 2012 R2. Виртуальный компьютер работает под управлением Windows 7 Professional x64, оснащён процессором Intel® Core™ i3-4130 (Haswell, кэш 3 МБ, 3,40 ГГц, доступно только одно ядро) и 4 ГБ оперативной памяти. Для хранения входных и выходных файлов используется RAM-диск, чтобы обеспечить максимальную производительность ввода-вывода.

Языки программирования

На странице учебного курса в системе на вкладке «Компиляторы» можно ознакомиться с актуальным списком доступных языков программирования, версиями компиляторов и параметрами командной строки их вызова.

Размер системного стека явно не задаётся (используется размер по умолчанию). При компиляции кода на C++ включен режим оптимизации O2.

Новый colmap необходимо предварительно установить только с CMake, Boost, QT5, CUDA и CGAL в соответствии с методом компиляции официального сайта.

1.CMake

CMake проще всего установить, перейти на официальный сайт, скачать сжатый пакет и распаковать его. Рекомендуется скачать новую версию.

После распаковки добавьте каталог bin в переменную окружения Path. Как показано на рисунке:


2.Boost

Рекомендуется скачать предварительно скомпилированную версию и выбрать собственную версию, соответствующую битам компилятора и операционной системы. Я решил компилировать исходный код раньше. Я не знаю, почему он был скомпилирован как 32-битный, COLMAP не может быть использован. Просто используйте предварительно скомпилированную версию. Я скачал версию 1.66, 64-битную скомпилированную с VS2015. Соответствующие имена:boost_1_66_0-msvc-14.0-64.exe。

После загрузки дважды щелкните его, чтобы извлечь его в папку, и по умолчанию я извлек его на диск C. Должна быть соответствующая версия библиотеки lib:


И добавьте переменные среды:


3.QT5

Бесплатная версия QT свяжется с вами по электронной почте после того, как вы заполните свои личные данные для загрузки или вы сможете скопировать инсталляционные пакеты других людей. Я скопировал онлайн-установочный пакет моих одноклассников. Во время установки я выбрал установку только 64-битной версии QT5.11.2. Компилятор все еще работает с VS2015.


4.CUDA

Есть много руководств по установке CUDA, поэтому я не буду повторять их здесь. Я установил CUDA9.1 с GTX 1060. Конечно, CUDA из COLMAP является дополнительной установкой согласно официальному сайту.

5.CGAL

Приведенная выше ссылка включает в себя метод загрузки и установки CGAL. ​​Я скачал установщик CGAL4.13 exe. Он не завершился после распаковки в указанный каталог. Обязательно снова скомпилируйте его с CMake. Папка сборки появится в распакованном каталоге. Добавьте переменные среды. Снимок экрана официального сайта выглядит следующим образом:


После установки вышеуказанных зависимостей вы можете начать компиляцию colmap.

Перед компиляцией проверьте, присутствуют ли все переменные окружения:


Здесь я скачал и скомпилировал версию dev. После загрузки находится сжатый пакет, разархивируйте его в каталог с файлом, который вы хотите поместить.

Рекомендуется использовать метод компиляции скрипта python на официальном сайте, поскольку этот метод компиляции поможет вам автоматически загружать необходимые зависимые библиотеки, что намного удобнее, чем использование CMake самостоятельно.

1. установить питон

Я скачал версию 3.6.6. Процесс установки прост, так же, как и CMake, лучше всего открыть окно cmd после завершения установки, ввести python и посмотреть, есть ли какие-либо выходные данные.

Таким образом, определите, можно ли его использовать нормально.


После того, как основная работа завершена, следуйте инструкциям скрипта на официальном сайте.

Откройте командное окно cmd и введите:

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

Вы можете запустить его, вы можете столкнуться с некоторыми небольшими проблемами, такими как проблема прямого и обратного слеша при компиляции. Если я не понимаю причину, путь CUDA должен использовать обратный слеш, и прямой слеш не будет найден.

Состояние сети должно быть хорошим во время процесса компиляции, он сам загрузит несколько зависимых библиотек:


После завершения компиляции файл компоновки генерируется в каталоге файлов исходного кода:


Просто откройте COLMAP.sln.

Обратите внимание, что colmap.exe установлен как элемент запуска, встречается
Ошибка C1128 Количество разделов превышает ограничение формата объектного файла: используйте / bigobj для компиляции D: \ colmapcode \ colmap-dev \ src \ feature \ Match.cc 1
Щелкните правой кнопкой мыши по родительскому каталогу соответствующего файла cc


Выберите свойства, параметры C / C ++, выберите командную строку и введите / bigobj ниже. Приложение в порядке.


Я также столкнулся с проблемой, что DLL не может быть найден, и был только черный ящик без интерфейса. Вот скриншот конфигурации, которая должна быть изменена.


Установите colmap.exe в качестве элемента запуска здесь.

Затем, если вы не можете найти библиотеку dll или lib, добавьте ее непосредственно в D: \ colmapcode \ colmap-dev \ build \ __ install __ \ lib. Это мой путь. Или поменять


Выберите атрибут colmap_exe.


После настройки параметров команды gui и environment может появиться colmap с интерфейсом. На этом вы закончили.

Основная проблема Google search bigobj показывает, что многие люди испытывают фатальную ошибку C1128 : "количество разделов превысило ограничение формата объектного файла : компиляция с /bigobj ". Ошибка имеет больше шансов возникнуть, если вы активно используете библиотеку шаблонов C++, например Boost библиотеки или CGAL библиотеки .

Эта ошибка странна, потому что она сама дает решение: установите флаг компилятора /bigobj !

Итак, вот мой вопрос: почему этот флаг не установлен по умолчанию? Должен быть штраф за использование этого флага, иначе он будет установлен по умолчанию. Это наказание не задокументировано в MSDN. У кого-нибудь есть ключ?

Я задаю этот вопрос, потому что мне интересно, не должна ли система конфигурации CGAL устанавливать /bigobj по умолчанию.

1 ответ

Акула сказала мне это: Эта инструкция является началом цикла, который не выровнен по границе 16-байтового адреса. Для оптимальной производительности вы должны выровнять начало горячего цикла с помощью директивы компилятора. С gcc 3.3 или более поздней версией используйте флаг.

В документации упоминается важный недостаток /bigobj :

Компоновщики, поставленные до Visual C++ 2005, не могут читать файлы .obj которые были произведены с /bigobj .

Таким образом, установка этого параметра по умолчанию ограничит количество компоновщиков, которые могут использовать результирующие объектные файлы. Лучше активировать его по мере необходимости.

Похожие вопросы:

Мне нужно построить Boost с нестандартным набором флагов (из-за конфликта между потоками Boost и C++/CLI). Я добавляю требуемый флаг (/clr), используя CXXFLAGS, но этот флаг конфликтует с флагом.

Что такое флаг компилятора DNS_BLOCK_ASSERTIONS (C)?

Акула сказала мне это: Эта инструкция является началом цикла, который не выровнен по границе 16-байтового адреса. Для оптимальной производительности вы должны выровнять начало горячего цикла с.

С Xcode 4.2 и компилятором LLVM при компиляции для ARMv6 в сгенерированном приложении возникают некоторые очень странные ошибки (например, свойство width CGSize возвращает вместо него height). Чтобы.

У меня есть cpp-файл, который содержит огромный массив. Я получаю фатальную ошибку (превышен предел формата объектного файла) и предложение скомпилировать с флагом /bigobj Где я могу установить этот.

Я установил флаг компилятора -fno-objc-arc , но все равно получаю ARC forbids message. вот скриншот. Есть ли еще какие-то настройки, которые мне нужно изменить?

Мы активно используем boost::serialization и шаблоны в целом. Кажется, все идет хорошо. За исключением того, что мы наткнулись на загвоздку в наших сборках Windows. Это, по-видимому, вызывает.

Я использую Visual Studio 2012 для компиляции программы в режиме отладки. StylesDatabase.cpp и LanguagesDatabase.cpp раньше прекрасно компилировались без /bigobj . так как я удалил некоторые.

Здравствуйте, ilven, Вы писали:

I>Доброго времени суток! Подскажите пожалуйста имеется массив
I>double incidence[maxdim][maxdim] и при значении maxdim = 10000 начинаються проблемы в виде зависаний а при дальнейшем увеличении при компиляции (MS VC 7.1) выдается ошибка:
I>LINK : fatal error LNK1248: image size (9A1E7000) exceeds maximum allowable size (80000000). Что можно сделать?

выделять память динамически

Здравствуйте, ilven, Вы писали:

I>Доброго времени суток! Подскажите пожалуйста имеется массив
I>double incidence[maxdim][maxdim] и при значении maxdim = 10000 начинаються проблемы в виде зависаний а при дальнейшем увеличении при компиляции (MS VC 7.1) выдается ошибка:
I>LINK : fatal error LNK1248: image size (9A1E7000) exceeds maximum allowable size (80000000). Что можно сделать?

Свой класс. Если действительно нужно столько памяти — выделять её динамически, желательно — функцией VirtualAlloc[Ex]. А если массив разряжённый, можно и сэкономить.

От: Aleksey Pashko about:blank
Дата: 19.10.06 17:55
Оценка:
Здравствуйте, ilven, Вы писали:

I>Доброго времени суток! Подскажите пожалуйста имеется массив
I>double incidence[maxdim][maxdim]
небось глобальным объявил?!

I>и при значении maxdim = 10000 начинаються проблемы в виде зависаний а при дальнейшем увеличении при компиляции (MS VC 7.1) выдается ошибка:
при создании исполняемого модуля линкер пытается сразу зарезервировать место в секции .data для всего твоего массива. прикинь какого размера должен быть твой ехе-шник! т.е. то что ты назвал "зависаем" есть не что иное, как попытка линкера сгенерить файл размером около гига! (10 000 * 10 000 * sizeof(double))

I>LINK : fatal error LNK1248: image size (9A1E7000) exceeds maximum allowable size (80000000).
а здесь он уже и не пытается ничего создавать, прикинув сколько это всё будет весить.

I>Что можно сделать?
как уже говорилось — выделяй память из кучи!

Здравствуйте, ilven, Вы писали:

I>Доброго времени суток! Подскажите пожалуйста имеется массив
I>double incidence[maxdim][maxdim] и при значении maxdim = 10000 начинаються проблемы в виде зависаний а при дальнейшем увеличении при компиляции (MS VC 7.1) выдается ошибка:
I>LINK : fatal error LNK1248: image size (9A1E7000) exceeds maximum allowable size (80000000). Что можно сделать?

Re[2]: Как сделать поддержку больших массивов в MS VC
От: Aleksey Pashko about:blank
Дата: 20.10.06 13:49
Оценка:

double incidence[maxdim][maxdim] и при значении maxdim = 10000 начинаються проблемы в виде зависаний а при дальнейшем увеличении при компиляции (MS VC 7.1) выдается ошибка:
LINK : fatal error LNK1248: image size (9A1E7000) exceeds maximum allowable size (80000000).

Здравствуйте, ilven, Вы писали:

I>Доброго времени суток! Подскажите пожалуйста имеется массив
I>double incidence[maxdim][maxdim] и при значении maxdim = 10000 начинаються проблемы в виде зависаний а при дальнейшем увеличении при компиляции (MS VC 7.1) выдается ошибка:
I>LINK : fatal error LNK1248: image size (9A1E7000) exceeds maximum allowable size (80000000). Что можно сделать?

А ты уверен, что ты хочешь выделить гигабайт памяти? И прога не зависнет на таких объёмах информации?
Если же тебе позарез нужно именно 10000 на 10000, и у тебя два гига на борту, то выделяй память для подмассивов динамически —

Правильно работающая программа — просто частный случай Undefined Behavior Re[2]: Как сделать поддержку больших массивов в MS VC

Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, ilven, Вы писали:

Да, если массив разрешеный — то возможно тебя удовлетворит

std::map<std::pair<int, int>, double>
Ещё можно заменить double на float или fixed point short int.

Читайте также: