web-dev-qa-db-ja.com

不明なタイプ名「off64_t」

UbuntuでGCC 4.8.1を使用したApache Portable Runtimeの使用に問題があります

問題は、gccを使用してコンパイルする場合、off64_t<sys/types.h>を使用できないことです。 (g++でコンパイルすると、すべて正常に動作します)

off64_tを有効にするために使用するコンパイラスイッチを知っている人はいますか? (_LARGEFILE_SOURCE _LARGEFILE64_SOURCEを定義すると問題が回避されることはわかっていますが、これが正しい方法かどうか疑問に思います)

エラーを再現するには、次のコードをコンパイルしてみます。

#include <sys/types.h>
off64_t a_variable;
14
Der Appit

off64_tは言語定義型ではありません。コンパイラスイッチはそれを使用可能にしません。

これはsys/types.hで定義されていますが、(32ビットシステムでは)

  • _LARGEFILE64_SOURCEが定義されている
    64ビットインターフェイスを使用可能にするもの(off64_t、lseek64()など...)。
    32ビットインターフェイスは、元の名前で引き続き使用できます。

  • _FILE_OFFSET_BITSは「64」として定義されています
    (それ以外の場合は32ビット)関数とデータ型の名前が64ビットの対応物を参照するようにするもの。
    off_tはoff64_tになり、lseek()はlseek64()を使用し、以下同様に続きます...
    32ビットインターフェイスは使用できなくなりました。

これらのマクロをプログラムの任意の場所で定義する場合は、すべてのソースファイルの先頭で定義するようにしてください。あなたはODR違反があなたをろばに刺されて欲しくありません。

これは32ビットシステム用であり、off_tは通常32ビット値です。
64ビットシステムでは、インターフェイスはすでに64ビット幅です。大きなファイルをサポートするためにこれらのマクロを使用する必要はありません。
off_tは64ビットタイプであり、lseek()は64ビットオフセットを期待します。
さらに、名前に64が含まれる型と関数は定義されていないため、意味がありません。

参照 http://linux.die.net/man/7/feature_test_macros
および http://en.wikipedia.org/wiki/Large_file_support

また、g ++を使用すると、_GNU_SOURCEが自動的に定義され、(gnu cランタイムライブラリを使用して)_LARGEFILE64_SOURCEが定義されなくなることにも興味があるかもしれません。そのため、テストプログラムをg ++でコンパイルすると、off64_tが表示されます。 APRは_LARGEFILE64_SOURCEを定義する際に同じロジックを使用すると思います。

15
James Caccese

少し遅れますが、まだ最新です。コンパイラフラグに-Doff64_t = _off64_tを追加するだけです。

6
xTrameshmen

再定義off64_tから__off64_tをコンパイルフラグに追加します。 Makefileを編集して、以下を含めます。

CFLAGS= -Doff64_t=__off64_t

次に、$ make 1(あなたが1.c(ディレクトリ内)

6
Raynal Gobel

私の環境のgccバージョン4.1.2では、__ USE_LARGEFILE64を定義する必要があります。 lseek64()を定義する/usr/include/unistd.hからこのマクロを見つけました

#define __USE_LARGEFILE64
#include <sys/types.h>
#include <unistd.h>
1
foxfoot

$ C_INCLUDE_PATHを定義して、Linuxヘッダーを指すようにする必要があります。

export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu

Linuxヘッダーをインストールするには、

Sudo apt-get install linux-headers-`uname -r`

追伸.

$ cat 1.c
#include <sys/types.h>
off64_t a_variable;
int main(){return 0;}

$ gcc --version
gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1

$ echo $C_INCLUDE_PATH
/usr/include/x86_64-linux-gnu

$ grep off64_t /usr/include/x86_64-linux-gnu/sys/types.h 
typedef __off64_t off_t;
#if defined __USE_LARGEFILE64 && !defined __off64_t_defined
typedef __off64_t off64_t;
# define __off64_t_defined
0
Ilmirus

パーティーにも遅れましたが、この問題を受け取った主な理由は、32ビットではなく64ビットバージョンのMinGWをインストールすることでした。

https://sourceforge.net/projects/mingw/

0
Mindsect Team

遅くなって申し訳ありませんが、今日までCプログラムにPerlコードを埋め込む必要はありませんでした^^

Unix/Linuxシステムの問題を解決しました(Vista以降、Windowsでこのような機能を作成することは可能だと思います)。PerlバージョンのCOREフォルダーを指すシンボリックリンクを作成します...

ln -s $(Perl -MConfig -e 'print $Config{archlib}')/CORE /usr/include/Perl

プロジェクトファイル、ソースコードに次の行を追加します。

#include <Perl/EXTERN.h>
#include <Perl/perl.h>

...そして私はoff_toff64_tに関連するメモとエラーの長いリストから、クリーンなビルド結果を得ました^^