10

これは以前にも発生しましたが、どのように修正したか思い出せません。

ここで、新しいUbuntuインストールでいくつかのプログラムをコンパイルできません...ヘッダーに何か問題があります。

g++-4.1 と 4.3 を試してみましたが、うまくいきませんでした。

g++ -g -frepo  -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include  -c qlisttest.cpp
/usr/include/libio.h:332: error: ‘size_t’ does not name a type
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope
/usr/include/libio.h:364: error: ‘size_t’ has not been declared
/usr/include/libio.h:373: error: ‘size_t’ has not been declared
/usr/include/libio.h:493: error: ‘size_t’ does not name a type
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared
...

ファイル...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
...



@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t
typedef __kernel_size_t    size_t;
typedef __kernel_ssize_t   ssize_t;

types.h は間違いなくパスにあり、ピックアップされています。ファイル名を変更して確認したところ、見つからないというエラーが表示されました...

誰にもアイデアはありますか...?私は本当に助けていただければ幸いです...

4

6 に答える 6

9

-I/usr/include/linux と -I/usr/include を削除することから始めます。システム ディレクトリを手動でインクルード パスに追加しても、効果がないか、問題が発生します。また、安全性を高めるために -frepo を削除してください。

于 2009-07-10T07:26:45.467 に答える
4

通常、C++ には C .h ファイルを使用しないでください。これを回避する簡単な方法が見つかるかもしれませんが、これの多くは g++ の以前のバージョンや他のコンパイラで許可されていましたが、C++ 標準では size_t が cstddef にあるように定義されています (セクション 18.2/表 17 を参照)。g++ はますます厳密になっています。

コマンドに追加したすべてのインクルード パスを削除し (それらは冗長です)、含まれていない場合はソース コードの先頭に追加します。

#include <cstddef>
using namespace std;
于 2009-07-10T06:57:27.867 に答える
4

完全なソースを見ずに問題が何であるかを言うのは難しい. このような問題をデバッグする最善の方法は、g++ の「-E」パラメーターを使用してプリプロセッサー出力を生成し、それを見てインクルードで何が起こっているかを把握することです。「-E」についてのg ++​​情報ページの内容は次のとおりです。

-E 前処理段階の後に停止します。コンパイラを適切に実行しないでください。出力は前処理されたソース コードの形式で、標準出力に送信されます。

また、ファイルの先頭に sys/types.h を含めないのはなぜですか?

補遺:

私のシステムでは、次の内容のみを含む foo.cc という短いファイルを作成しました。

#include <time.h>

そして、私は実行しました:

g++ -E /tmp/foo.cc > /tmp/foo.pp

この出力を詳細に調べることは非常に重要です。たとえば、/usr/include/bits/types.h には __time_t の typedef があり、/usr/include/types.h はその typedef を使用して「typedef __time_t time_t」と言うことがわかりました。しかし、その定義を取り囲む興味深いマクロが他にもあります。/usr/include/time.h のマクロ "__BEGIN_NAMESPACE_STD" などに特に注意してください。これは、私のシステムでは空の定義のようです。しかし、他のシステムではこのマクロに異なる値があり、time_t の定義を他の名前空間に強制している可能性があると想像できます。

ファイルの行の形式を定義する Cpp 情報ページのセクション「9 プリプロセッサ出力」を読んでください。特に注目すべきは、次のセクションです。

ソース ファイル名と行番号の情報は、次の形式の行によって伝達されます。

# LINENUM ファイル名フラグ

そして、このレベルのデバッグで重要な "FLAGS" について説明します。

于 2009-07-10T06:17:41.940 に答える
3

Forgot to follow up on this. It turns out that /usr/include cannot be included with /usr/include/linux on this particular distro. size_t seems to be get wiped out by the second includes.

My includes are now merely /usr/include and it works great.

-I/usr/include -I/usr/include/ace -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0...

Pulling out all the includes and playing with them fixed it.

于 2009-07-18T17:30:23.960 に答える
3

build-essential パッケージをインストールしましたか?

sudo apt-get install build-essential
于 2009-07-10T16:59:36.247 に答える
1

stddef.hまたはcstddefにある必要があります。types.hは標準ライブラリではなく、OSが必要とするタイプを指していると思います。

于 2009-07-10T17:34:35.443 に答える