statfs構造体
error: redefinition of `struct statfs'というエラーが出た。
statfsを定義しているファイルは以下の2つ。
% grep -r '^struct statfs' /usr/include /usr/include/bits/statfs.h:struct statfs /usr/include/asm/statfs.h:struct statfs {
bits/statfs.hではこんな定義
struct statfs { int f_type; int f_bsize; #ifndef __USE_FILE_OFFSET64 __fsblkcnt_t f_blocks; __fsblkcnt_t f_bfree; __fsblkcnt_t f_bavail; __fsfilcnt_t f_files; __fsfilcnt_t f_ffree; #else __fsblkcnt64_t f_blocks; __fsblkcnt64_t f_bfree; __fsblkcnt64_t f_bavail; __fsfilcnt64_t f_files; __fsfilcnt64_t f_ffree; #endif __fsid_t f_fsid; int f_namelen; int f_spare[6]; };
asm/statfs.hではこんな定義
struct statfs { long f_type; long f_bsize; long f_blocks; long f_bfree; long f_bavail; long f_files; long f_ffree; __kernel_fsid_t f_fsid; long f_namelen; long f_spare[6]; };
普通は、カーネルモジュール等linux限定で使うものがasm/statfs.hの方を使って、
アプリケーション等移植性をもたせるものはbits/statfs.h(実際はsys/statfs.h経由)の方を使うようで、
まぜて使うことはあまりやらないようだ。
,
Re: 2.2.1 header conflicts
Usually it's best to use the kernel's headers (
'http://www.linuxhq.com/lnxlists/linux-gcc/lg_9902/msg00051.html
とりあえず今回は、asm/statfs.h側を#ifndef〜#endifで囲って控えに回ってもらうことにした(が、これでいいのか?)
STATFS_F_NAMELENを使ったのは、bits/statfs.hの最後に、#define _STATFS_F_NAMELENと書いてあったから。
#ifndef _STATFS_F_NAMELEN struct statfs { (略) }; #endif
_FILE_OFFSET_BITS
gcc -D_FILE_OFFSET_BITS=64 file.c
としてコンパイルするとソース変更無しに2G以上のファイルが扱えるようになるらしい
,
Manpage of FEATURE_TEST_MACROS
_FILE_OFFSET_BITS
このマクロを値 64 で定義すると、ファイル I/O とファイルシステム操作に 関連する 32 ビット版の関数とデータタイプは自動的に 64 ビット版に 変換される。 これは、32 ビットシステムで大きなファイル (> 2 ギガバイト) の I/O を実行する際に役立つ (このマクロを定義すると、コンパイルし直すだけで大きなファイルを 扱えるプログラムを書くことができる)。 64 ビットシステムは、もともと 2 ギガバイトより大きなファイルを 扱えるので、64 ビットシステムではこのマクロは効果を持たない。
'http://www.linux.or.jp/JM/html/LDP_man-pages/man7/feature_test_macros.7.html