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


7

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

Alles schien gut zu gehen, bis ich entdeckte, dass ich die 2,0-GB-Grenze nicht überschreiten 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 ... (didn ' t work)
Ich habe etwas über die Optionen eines Compilers gelesen (?) ... aber ich verliere mich an diesem Punkt?

Ich bin überrascht, dass es nicht sofort funktioniert hat, da ich dachte, dass das Limit von 2,0 GB eine alte Geschichte ist, was die Standardeinstellungen angeht ... wieder falsch? :(

Mein Betriebssystem ist 32-Bit auf 32-Bit-Hardware.
Der gcc-Versionsbericht lautet 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 den Warnhinweisen: Abschnitt 'info xxd' (..nur unter Linux;)

Antworten:


1

Ich empfehle das Hinzufügen -D_GNU_SOURCE, solange #include <features.h>es verwendet wird. Dadurch wird die gesamte Unterstützung für große Dateien aktiviert. Lesen Sie den Anfang von /usr/include/features.hfü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.

Ich gehe davon aus, dass dies der beste GNU-Weg ist, um von vorne zu beginnen ... (von wo aus die meisten Codierungssituationen "beginnen"). Es ist also die beste Allround-Lösung
Peter.O

4

Eine einfache #define scheint alles zu sein, was benötigt wird. (Das Programm schreibt jetzt über 2 GB hinaus.)

Vielleicht liegt der Grund dafür, dass es nicht richtig kompiliert wurde, darin, dass ich ein einzelnes Programm aus einer viel größeren Suite kompiliert habe ('xxd' ist Teil von 'vim') ...

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

Für jeden, der auf diese Seite kommt, kann Folgendes von Nutzen 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.

1
Noch kürzer:cpp -dM /dev/null
Kees Cook

cpp -dM <Eingabe> <Strg> D ... Sie haben mich dazu gebracht, darüber nachzudenken, was / dev / null hier tatsächlich tut ... und ich denke, ich verstehe jetzt auch, was mit cpp passiert. Diese # müssen vorangestellt werden. definiert für alle Jobs, die es verarbeitet, und in diesem Fall erhält das Terminal die Ausgabe anstelle des nächsten Werkzeugs in der Pipe; macht Sinn ... Es gibt keine Magie ... es sind wirklich nur Einsen und Nullen ... aber es kann sicherlich wie Magie aussehen. :) ...
Peter.O

0

Ich hatte das gleiche Problem - konnte keine Datei schreiben, die größer als 2 GB war. Mein Betriebssystem war 64 Bit, der Mountpunkt war jfs2 und mein fsize = -1 Ich habe fopen in meinem Programm nur in fopen64 und voila geändert!


fopenist ein Alias ​​von fopen64auf 64-Bit-Plattformen.
David Foerster
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.