it-swarm.com.de

Wie kann ich gcc dazu bringen, eine Datei zu schreiben, die größer als 2,0 GB ist?

Ich wollte 'xxd' (geschrieben in C) neu kompilieren, deshalb habe ich CodeBlocks als IDE installiert.

Alles schien gut zu laufen, bis ich herausfand, dass ich nicht über die 2,0-GB-Grenze hinaus schreiben konnte ...

Ich habe gelesen, dass 'gcc' neu kompiliert werden muss ... (Das klingt ein bisschen dramatisch ..)
Ich habe gelesen, dass ich 'fread64 ()' anstelle von 'fread ()' verwenden kann ... (hat nicht funktioniert)
Ich habe etwas über Compiler-Optionen gelesen (?) ... aber ich verliere mich an diesem Punkt?

Ich bin überrascht, dass es nicht sofort funktioniert hat, da ich dachte, die 2,0-GB-Grenze sei altmodisch, was die Standardeinstellungen angeht ... schon wieder falsch? :(

Mein Betriebssystem ist 32-Bit, auf 32-Bit-Hardware.
Die gcc-Version berichtet wie folgt: gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Gibt es einen einfachen Weg, um dieses Problem zu umgehen?

PS .. Ich war fasziniert von der WARNINGS: Sektion von 'info xxd' (..nur unter Linux;)

7
Peter.O

Ich empfehle, -D_GNU_SOURCE hinzuzufügen, solange #include <features.h> verwendet wird. Dadurch wird die gesamte Unterstützung für große Dateien aktiviert. Lesen Sie den Anfang von /usr/include/features.h für weitere Details:

...
_LARGEFILE_SOURCE    Some more functions for correct standard I/O.
_LARGEFILE64_SOURCE  Additional functionality from LFS for large files.
_FILE_OFFSET_BITS=N  Select default filesystem interface.
....
_GNU_SOURCE      All of the above, plus GNU extensions.
1
Kees Cook

Ein einfaches # define scheint alles zu sein, was benötigt wird. (Das Programm schreibt jetzt mehr als 2 GB.)

Vielleicht hat es nicht richtig kompiliert, weil ich ein einzelnes Programm aus einer viel größeren Suite kompiliert habe ('xxd' ist Teil von 'vim') ...

Hätte ich 'vim' zusammengestellt, hätte es höchstwahrscheinlich gut funktioniert ...

Für jeden, der auf diese Seite kommt, kann Folgendes von Wert sein:
Ich gehe davon aus, dass ähnliche Einstellungen für andere IDEs gelten würden.

Adding #defines

* Using CodeBocks (as a global setting)
  =====================================
  Settings
    Compiler and Debugger...
      [Compiler Settings]
        [#defines] ... Add the following
         _FILE_OFFSET_BITS="64"

* Using CodeBlocks (for a given Project)
  ======================================
  Properties
    Build Options
      [Compiler Settings]
        [#defines] ... Add the following
         _FILE_OFFSET_BITS="64"

* Directly into gcc's command line
  ================================
  gcc -D_FILE_OFFSET_BITS="64"

* Add a #define directly to the source
  ====================================
  #define _FILE_OFFSET_BITS  64  

Außerdem habe ich dieses Snippet entdeckt, als ich nach der Lösung gegoogelt habe ...
Welche Makros sind von gcc vordefiniert? ... im Terminal:

  • berühre foo.h; cpp -dM foo.h
4
Peter.O

Ich hatte das gleiche Problem - konnte keine Datei größer als 2 GB schreiben. Mein Betriebssystem war 64-Bit, der Einhängepunkt war jfs2 und meine fsize = -1. Alles, was ich getan habe, war, fopen in meinem Programm auf fopen64 und voila zu ändern!

0