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;
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を定義する際に同じロジックを使用すると思います。
少し遅れますが、まだ最新です。コンパイラフラグに-Doff64_t = _off64_tを追加するだけです。
再定義off64_t
から__off64_t
をコンパイルフラグに追加します。 Makefile
を編集して、以下を含めます。
CFLAGS= -Doff64_t=__off64_t
次に、$ make 1
(あなたが1.c
(ディレクトリ内)
私の環境のgccバージョン4.1.2では、__ USE_LARGEFILE64を定義する必要があります。 lseek64()を定義する/usr/include/unistd.hからこのマクロを見つけました
#define __USE_LARGEFILE64
#include <sys/types.h>
#include <unistd.h>
$ 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
パーティーにも遅れましたが、この問題を受け取った主な理由は、32ビットではなく64ビットバージョンのMinGWをインストールすることでした。
遅くなって申し訳ありませんが、今日まで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_tとoff64_tに関連するメモとエラーの長いリストから、クリーンなビルド結果を得ました^^