web-dev-qa-db-ja.com

cc1plus:エラー:インクルード:g ++でコンパイルするときに定義されたデータ型に対して値が大きすぎます

私はWindowsとLinuxでコンパイルする必要があるプロジェクトを作成しています。 Visual Studioでプロジェクトを作成してから、Linux用のメイクファイルを作成しました。 VSを使用してWindowsですべてのファイルを作成しました。

VSで完全にコンパイルおよび実行されますが、makefileを実行してg ++を実行すると次のようになります。

$ g++ -c -I include -o obj/Linux_x86/Server.obj src/Server.cpp
cc1plus: error: include: Value too large for defined data type
cc1plus: error: src/Server.cpp: Value too large for defined data type

コードはHelloWorldatmにすぎません。開発を始める前に、すべてが機能していることを確認したかっただけです。私は検索を試みましたが、役に立ちませんでした。

どんな助けでもいただければ幸いです。

24
A Jackson

私は少なくともUbuntuで解決策を見つけました。私は、あなたがお気づきのように、エラーはマウントされたsamba共有でのみ発生します-それはファイルを記述しているg ++から来ているようです、iノードは非常に大きな値を返します。

共有をマウントするときは、オプションに、nounix、noserverinoを追加します。

mount -t cifs -o user=me,pass=secret,nounix,noserverino //server/share /mount

http://bbs.archlinux.org/viewtopic.php?id=85999 で情報を見つけました

35
Paul Ridgway

私も同様の問題を抱えていました。 CIFSにマウントされたSamba共有でプロジェクトをコンパイルしました。 1つのLinuxカーネルでコンパイルが実行されましたが、他のLinuxカーネル(2.6.32.5)を使用すると、「定義されたデータ型に対して値が大きすぎます」という同様のエラーメッセージが表示されました。提案された「nounix、noserverino」CIFSマウントオプションを使用すると、問題が修正されました。その場合、CIFSのマウントに問題があり、大きなファイルがないため、エラーメッセージは誤解を招く可能性があります。

2
Laszlo

GNU Core Utils:

27定義されたデータ型に対して値が大きすぎます

これは、ご使用のバージョンのユーティリティが、大きなファイルのサポートを有効にしてコンパイルされていないことを意味します。 GNUユーティリティは、コンパイルされている場合、大きなファイルをサポートします。再度コンパイルして、大きなファイルのサポートが有効になっていることを確認してください。このサポートは、ほとんどの場合、autoconfによって自動的に構成されます。しかし、特定のシステムではそれを行う方法を決定できなかった可能性があるため、autoconfはシステムが大きなファイルをサポートしていないと結論付けました。

「定義されたデータ型に対して値が大きすぎます」というメッセージは、大きなファイルの操作が大きなファイル以外のデータ型を使用して試行されたときに報告されるシステムエラーメッセージです。大きなファイルは、符号付き32ビット整数よりも大きいもの、または言い換えると2GBよりも大きいものとして定義されます。

ファイルを処理する多くのシステムコールは、「longint」データ型の値を返します。 32ビットハードウェアでは、long intは32ビットであるため、ファイルのサイズに2GBの制限が課せられます。これが発明されたとき、それは巨大であり、それほど大きなものが必要であるとは想像しがたいものでした。時間が経ち、ファイルは今日はるかに大きくなる可能性があります。ネイティブ64ビットシステムでは、ファイルサイズの制限は通常2GB * 2GBです。これはまた巨大だと思います。

32ビットの「longint」を使用する32ビットシステムでは、これ以上大きくすることはできず、以前のプログラムとの互換性を維持することもできません。それを変えると多くのことが壊れます!しかし、多くのシステムでは、すべてのファイル操作を64ビットプログラムモデルに書き換える新しいプログラムモードに切り替えることができます。 「long」の代わりに、64ビットサイズに構築された「off_t」と呼ばれる新しいデータ型を使用します。プログラムのソースコードは、longデータ型ではなくoff_tデータ型を使用するように記述する必要があります。これは通常、-D_FILE_OFFSET_BITS = 64などを定義することによって行われます。システムに依存します。一度実行してこの新しいモードに切り替えると、ほとんどのプログラムは大きなファイルを問題なくサポートします。

誤って大きなファイルを作成し、それを処理する方法が必要な場合は、次の質問を参照してください。

1
stefanB

mergerfsファイルシステムを使用している場合、use_inoオプションを削除すると、問題が解決します: https://github.com/trapexit/mergerfs/issues/485

0
lashgar