В объектном файле слишком много разделов

Мы активно используем boost :: serialization и templates в целом. Кажется, все идет хорошо.

Кроме того, мы нанесли удар по нашим assemblyм Windows. Кажется, что проблемы в объектных файлах слишком велики. Мы используем MinGW / Msys с g ++ 4.7.0.

c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/as.exe: CMakeFiles/source.dir/sourcecode.cpp.obj: too many sections (33396) C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Assembler messages: C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Fatal error: can't write CMakeFiles/source.dir/sourcecode.cpp.obj: File too big 

Мастер google открыл это заархивированное сообщение, http://sourceforge.net/mailarchive/forum.php?thread_name=CA%2Bsc5mkLvj%3DW9w2%3DsY%3Dc_N%3DEwnsQuPDEX%3DiBcbsbxS3CuE_5Bg%40mail.gmail.com&forum_name=mingw-users

В нем это указывает на то, что другой человек сильно ударил по одной и той же ловушке. Он указывал на опцию опции Visual Studio /bigobj которая, как представляется, делает то, что нам нужно. Однако мы не можем перейти к Visual Studio.

Одно из предложений заключалось в добавлении –hash-size в опции ассемблера. Это не помогло.

Если я не ошибаюсь, проблема заключается в том, что в объектных файлах есть ограничение на 2 ^ 16 записей. На самом деле, согласно сообщению об ошибке, я бы рискнул, что это подписанные 2 ^ 16 записей, но это арахис. Опция /bigobj для Visual Studio изменила бы это на 2 ^ 32. Результат списка рассылки не знал об эквивалентной опции для gcc. Дальнейшие результаты Google, похоже, не имеют отношения к этому.

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

Поэтому мой вопрос: есть ли gcc эквивалент опции Microsoft /bigobj ? Есть третий вариант, который я еще не нашел?

Решение заключается в добавлении опции -Wa,-mbig-obj если ваша версия GCC поддерживает эту опцию. Вероятно, вам это нужно только на этапе компиляции, а не на этапе компоновщика.

Если ваш компилятор не поддерживает этот параметр, вы должны изучить использование mingw-w64 и MSYS2 .

Ошибка "%B: too many sections (%d)" происходит от функции coff_compute_section_file_positions() расположенной в bfd/coffcode.h . Он создается, когда выходной файл .obj (в формате COFF) содержит более 32766 разделов. Невозможно избежать этой ошибки, по крайней мере, если вы не хотите использовать формат объекта Windows PE / COFF; Файлы COFF используют только два байта для «NumberOfSections» в заголовке файла.

Мне непонятно, почему, as (сборщик GNU), кол-во секций составляет 32768-минус-2 вместо 65536-минус-1 (раздел 0 зарезервирован); но в любом случае этого может быть недостаточно, если вы сильно используете шаблоны, а ваш компилятор реализует шаблоны через разделы COMDAT.

Как вы уже заметили, передача /bigobj компилятору Microsoft заставляет его выводить формат COFF с munged с до 2 31 секциями, что «должно быть достаточно для кого-то». Тем не менее, формат munged формально недокументирован, и я не вижу никакой неофициальной документации (сообщения в блогах или что-то-вы) по этому вопросу, поэтому пока кто-то с копией MSVC не сможет написать спецификацию для /bigobj , это не имеет большого шанса попасть в инструменты GNU.

ИМХО, если вы пытаетесь сделать сборку Windows, вам нужно просто укусить пулю и использовать MSVC. Никто кроме Microsoft не имеет особого желания тратить время на борьбу с форматом PE / COFF.

Я нашел некоторые обновления в этом вопросе, кажется, исправлен в новых binutils для x64-окон, см. https://sourceware.org/ml/binutils/2014-03/msg00114.html и http://sourceforge.net/p / mingw-w64 / bugs / 341 / . Однако я не тестировал его, поскольку это исправление не относится к 32-битным версиям, которые мне нужны.

Я столкнулся с той же проблемой, когда я скомпилировал библиотеку Poco с помощью MinGW-w64, оказалось, что объект отладки был огромным для одного файла реализации.

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

В качестве решения вы можете включить оптимизацию компилятора: начиная с -O1 до -O3, с каждым шагом он будет создавать меньший объектный файл, он может решить проблему, это было в моем случае. Да, для отладочных compilationов это может быть нежелательно, вы можете попробовать -Og также

  • Поставщик Microsoft.ACE.OLEDB.12.0 не зарегистрирован
  • Могу ли я разработать .NET Framework 4 в Visual Studio 2008?
  • Где Visual Studio ищет файлы заголовков C ++?
  • Как создать библиотеку импорта (.lib) И DLL в Visual C ++?
  • Слабая связь GCC в Visual Studio?
  • Сделайте Visual Studio понятием CamelCase при нажатии клавиш Ctrl и курсора
  • Сделать ListView.ScrollIntoView Прокручивать элемент в центр ListView (C #)
  • Обнаружить версию целевой рамок во время компиляции
  • Изменение целевых настроек процессора в Visual Studio 2010 Express
  • Intellisense не работает для JavaScript в Visual Studio 2012
  • Получить Visual Studio для запуска шаблона T4 для каждой сборки
  • Interesting Posts

    Абстрактные classы vs Интерфейсы

    Как настроить яркость подсветки монитора в Windows

    Найти первый элемент по предикату

    Как определить, какой тип JRE установлен – 32 бит против 64 бит

    Контролировать использование сети процесса?

    Где EXE для подсистемы для Unix-приложений, поэтому я могу использовать его?

    Толщина границы контрольной точки в ggplot

    Игнорирование сертификата SSL в Apache HttpClient 4.3

    android: Как я могу реализовать первый учебник, например Go Launcher в моем приложении?

    Установить на тот же путь при обновлении приложения

    В чем разница между веб-сайтом Azure и ролью Azure Web?

    Почему в 64-битном виртуальном адресе есть 4 бита (48 бит) по сравнению с физическим адресом (длиной 52 бит)?

    Существуют ли различия в ожидании жизни для 1 ~ 2 ТБ внешнего (портативного) жесткого диска и внешнего (настольного) жесткого диска

    Возможно ли, чтобы root выполнил команду как non-root?

    Каков пример утиной печати на Java?

    Давайте будем гением компьютера.