Objektdatei hat zu viele Abschnitte
Wir mache Regen Gebrauch von boost::serialization und Vorlagen im Allgemeinen. Alles scheint gut zu laufen.
Ausnahme, die wir getroffen haben ein Problem auf unserem Windows-builds. Es scheint Probleme in der Objekt-Dateien zu groß. Wir sind mit MinGW/Msys mit 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
Master-google enthüllt das archivierte Nachricht, http://sourceforge.net/mailarchive/forum.php?thread_name=CA%2Bsc5mkLvj%3DW9w2%3DsY%3Dc_N%3DEwnsQuPDEX%3DiBcbsbxS3CuE_5Bg%40mail.gmail.com&forum_name=mingw-users
In ihm, es zeigt an, dass eine andere person trifft so ziemlich das gleiche Problem. Es hat eine option für Visual Studio /bigobj
option, die angezeigt wird, zu tun, was wir brauchen. Allerdings sind wir nicht in der Lage, sich zu bewegen, um Visual Studio.
Ein Vorschlag war hinzufügen --hash-Größe auf den assembler-Optionen. Dies hat nicht geholfen.
Wenn ich mich nicht Irre, das Problem liegt in der Tatsache, dass die Objekt-Dateien haben ein limit von 2^16 Einträge in Ihnen. Eigentlich, entsprechend der Fehlermeldung, würde ich es Wagen, dass es ein signed 2^16 Einträgen, aber das ist peanuts. Die /bigobj
option für Visual Studio ändern würde, dass 2^32. Die mailing-Liste Ergebnis nicht wussten, eine entsprechende option für den gcc. Weitere google-Ergebnisse scheinen nicht relevant zu sein.
In diesem Punkt müssen wir überarbeiten unseren code (pfui) um dieses Problem zu umgehen. Aber ich bin immer noch besorgt, dass, mit schweren templating, wir laufen könnte das Problem wieder und wieder (haben wir bereits, es mit drei Quell-Dateien).
Also meine Frage ist also; gibt es eine gcc-äquivalent zu Microsoft /bigobj
option? Gibt es eine Dritte option, ich bin noch nicht gefunden?
InformationsquelleAutor der Frage inetknght | 2013-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung ist das hinzufügen der option
-Wa,-mbig-obj
wenn Ihre version von GCC unterstützt diese option. Müssen Sie vermutlich nur während der Kompilierung Schritt, nicht der linker Schritt.Wenn Ihr compiler nicht unterstützt, die option, die Sie in Aussehen sollte unter Verwendung von mingw-w64 und MSYS2.
InformationsquelleAutor der Antwort David Grayson
Den Fehler
"%B: too many sections (%d)"
kommt von der Funktioncoff_compute_section_file_positions()
befindet sich inbfd/coffcode.h
. Es wird produziert, wenn der Ausgang.obj
- Datei im COFF-format) enthält mehr als 32766 Abschnitte. Es gibt keinen Weg, um diesen Fehler zu vermeiden, zumindest dann nicht, wenn Sie Windows verwenden möchten' PE/COFF object format; COFF-Dateien verwenden Sie nur zwei bytes für "NumberOfSections" in der Datei header.Es ist mir nicht klar, warum
as
(der GNU assembler) Kappen die Anzahl der Abschnitte ist im 32768-minus-2, statt der 65536-minus-1 (Abschnitt 0 ist reserviert); aber so oder so, das könnte nicht genug sein, wenn Sie machen starken Gebrauch von templates und dein compiler implementiert Vorlagen über COMDAT-Abschnitte.Da hast du schon bemerkt, vorbei
/bigobj
zu Microsoft ' s compiler verursacht, zur Ausgabe eines verwurschtelt COFF-format mit bis zu 231 Abschnitte, die "sollten für jeden genug sein." Jedoch, die verwurschtelt format ist offiziell nicht dokumentiert, und ich sehe keine informelle Dokumentation (blog-Beiträge oder was-haben-Sie) auf das Thema, so lange, bis jemand mit einer Kopie von MSVC kann die Erstellung einer Spezifikation für/bigobj
es stand nicht viel chance, in die GNU-tools.IMHO, wenn Sie versuchen, einen Windows-build, Sie sollten nur den sauren Apfel beißen und die Verwendung von MSVC. Niemand außer Microsoft, ist besonders motiviert, Zeit zu verschwenden, kämpfen mit dem PE/COFF-format.
InformationsquelleAutor der Antwort Quuxplusone
Fand ich einige updates in dieser Angelegenheit, so scheint es behoben werden in neuen binutils für windows x64, siehe https://sourceware.org/ml/binutils/2014-03/msg00114.html und http://sourceforge.net/p/mingw-w64/bugs/341/. Allerdings habe ich es nicht testen, da dieses Update gilt nicht für 32 bit-Versionen, die ich brauche.
InformationsquelleAutor der Antwort Vladimir Still
Ich Stand vor dem gleichen problem, wenn ich das kompilierte Poco Bibliothek mit MinGW-w64, es stellte sich heraus, dass der debug-Objekt war riesig für eine Implementierung-Datei.
Als Sie erwähnt können Sie split up cpp-Dateien, und es wird funktionieren, aber wenn Sie Angesicht mit jemandem, den Quellcode können Sie nicht tun, ohne etwas zu beschädigen.
Als Lösung können Sie auf compiler-Optimierungen: start mit -O1 bis -O3, mit jedem Schritt, den Sie bauen wird das kleinere Objekt-Datei, kann es das problem lösen, das Tat es in meinem Fall. Ja, für debug-builds kann es unerwünscht sein, du kannst es versuchen-Og sowie
InformationsquelleAutor der Antwort