Unknown type name 'off64_t'
Ich habe ein problem mit der Apache Portable Runtime unter Ubuntu mit GCC 4.8.1
Das problem ist, dass die off64_t
aus <sys/types.h>
ist nicht verfügbar, wenn das kompilieren mit gcc
. (Beim kompilieren mit g++
alles funktionieren)
Weiß jemand, welche compiler-Schalter zu verwenden, aktivieren off64_t
? (Ich weiß, dass die Definition _LARGEFILE_SOURCE _LARGEFILE64_SOURCE
vermeidet das problem, aber Frage mich, ob dies der richtige Weg ist)
Den Fehler zu reproduzieren, kann man einfach versuchen, das zu kompilieren, den folgenden code:
#include <sys/types.h>
off64_t a_variable;
- Dies kann helfen, stackoverflow.com/questions/9073667/...
- Seit dieser kommt zuerst bei der Suche nach
error: 'off64_t' does not name a type
eine Lösung, die mir geholfen, in diesem Fall war die Umstellung vom$ g++ --std=c++11
zu$ g++ --std=gnu++11
Du musst angemeldet sein, um einen Kommentar abzugeben.
off64_t ist keine Sprache definiert Art. Keine compiler-Schalter zur Verfügung stellen.
Es ist definiert in sys/types.h, aber (auf einem 32-bit system) nur, wenn
_LARGEFILE64_SOURCE ist definiert
Das wird die 64-bit-Schnittstellen zur Verfügung (off64_t, lseek64(), etc...).
Die 32-bit-Schnittstellen weiterhin verfügbar sein werden von Ihren ursprünglichen Namen.
_FILE_OFFSET_BITS ist definiert als '64'
Die machen dem Namen des (sonst 32 bit) - Funktionen und Datentypen verweisen auf Ihre 64-bit Pendants.
off_t werden off64_t, lseek() verwenden lseek64(), und so weiter...
Die 32-bit-Schnittstelle ist nicht mehr verfügbar.
Stellen Sie sicher, dass, wenn Sie definieren Sie diese Makros überall in Ihrem Programm, Sie definieren Sie zu Beginn alle Ihre source-Dateien. Sie wollen nicht, ODR Verletzungen zu, beißen Sie in den Arsch.
Hinweis, das ist für ein 32 bit-system, wo ist off_t normalerweise eine 32-bit-Wert.
Auf einem 64 bit-system, die Schnittstelle ist bereits 64 bits breit, die Sie nicht brauchen, um diese Makros verwenden, um die Unterstützung für große Dateien.
ist off_t ein 64-bit-Typ, lseek() erwartet einen 64-bit-offset, und so weiter.
Darüber hinaus werden die Arten und Funktionen mit 64 im Namen sind nicht definiert, gibt es keinen Punkt.
Sehen http://linux.die.net/man/7/feature_test_macros
und http://en.wikipedia.org/wiki/Large_file_support
Können Sie auch daran interessiert sein, zu wissen, dass bei der Verwendung von g++, _GNU_SOURCE ist automatisch definiert, die (mit dem gnu-c-Laufzeit-Bibliothek) führt zu _LARGEFILE64_SOURCE wird defiend. Das ist, warum kompilieren Sie Ihr test-Programm mit g++ macht off64_t sichtbar. Ich nehme an, APR verwendet die gleiche Logik bei der Herstellung _LARGEFILE64_SOURCE definiert.
Ein bisschen spät, aber immer noch aktuell.
Ich fügen Sie einfach-Doff64_t=_off64_t an den compiler-flags.
Neu definieren
off64_t
zu__off64_t
in Ihre Compiler-flag. Bearbeiten Sie IhreMakefile
es enthält also:dann einfach laufen
$ make 1
(vorausgesetzt, Sie haben1.c
im Verzeichnis)In meiner Umgebung gcc version 4.1.2, die ich brauche, um zu definieren, __VERWENDUNG_LARGEFILE64. Ich fand dieses makro aus /usr/include/unistd.h wer definiert lseek64()
Sollten Sie definieren $C_INCLUDE_PATH zu Punkt-zu-linux-Header, so etwas wie
Installation von linux-headers verwenden
P. S.
Sorry für die Verspätung, aber ich habe noch nie einbetten von perl-code in C-Programme bis heute ^^
Ich löste das Problem in Unix/Linux Systemen (ich denke, es ist möglich, erstellen Sie eine solche Funktion in Windows ab Vista) durch anlegen eines symbolischen Links, der auf der CORE-Ordner von perl-version...
In Ihr Projekt-Datei, source-code, fügen Sie einfach:
...und ich kam aus der langen Liste der Notizen und Fehler im Zusammenhang mit off_t und off64_t, um einen sauberen build-Ergebnis ^^
Auch spät, um der Partei, aber der Hauptgrund für den Empfang dieses Problem war die Installation der 64-bit-version von MinGW statt 32-bit:
https://sourceforge.net/projects/mingw/