5

私は原因を発見するために多くの努力を払っていませんが、gcc 4.8.1 では、c と c++ を組み合わせた古いソースと c++11 のいくつかの新しいものをコンパイルするのに多くの問題が発生しています。

このコードで問題を切り分けることができました。

# include <argp.h>
# include <algorithm>

g++ -std=c++0x -c -o test-temp.o test-temp.Cバージョン4.6.3、ubuntu 12.04で正常にコンパイルされます

対照的に、バージョン 4.8.1 では、同じコマンド ラインで多くのエラーがスローされます。

In file included from /home/lrleon/GCC/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/x86intrin.h:30:0,
                 from /home/lrleon/GCC/include/c++/4.8.1/bits/opt_random.h:33,
                 from /home/lrleon/GCC/include/c++/4.8.1/random:51,
                 from /home/lrleon/GCC/include/c++/4.8.1/bits/stl_algo.h:65,
                 from /home/lrleon/GCC/include/c++/4.8.1/algorithm:62,
                 from test-temp.C:4:
/home/lrleon/GCC/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/mmintrin.h: In function ‘__m64 _mm_cvtsi32_si64(int)’:
/home/lrleon/GCC/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/mmintrin.h:61:54: error: can’t convert between vector values of different size
   return (__m64) __builtin_ia32_vec_init_v2si (__i, 0);
                                                      ^

…などなど。

実行しても同じことが起こります

g++ -std=c++11 -c -o test-temp.o test-temp.C; 再び、バージョン 4.8.1

しかし、ヘッダー行を入れ替えると、

# include <algorithm>
# include <argp.h>

その後、すべて正常にコンパイルされます。

誰かが私に何が起こっているのかを理解するように教えてくれますか?

4

3 に答える 3

3

これは既知のバグです。一部のヘッダーextern "C"で適切な場所の宣言が欠落しているようです。

また、Windows 上の GCC 4.7.2 でこの問題に遭遇しました。すべての intrin.h ヘッダーに extern "C" 部分が欠落しているようです。関数は常にインラインであるため、シンボルはどこにも表示されないため、これは以前は問題になりませんでした。しかし、別のヘッダーがこれらの関数を再度宣言したため、もう一度何かを行う必要があります。

于 2013-09-27T05:35:41.760 に答える
3

私は同じ問題に遭遇しました。めんどくさいのでハックして にしました<argp.h>

これは、ubuntu 14.04 / gcc 4.8.2 でエラーをトリガーするコード (標準 gcc ヘッダー argp.h 内) です。

/* This feature is available in gcc versions 2.5 and later.  */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
#  define __attribute__(Spec) /* empty */
# endif

これはおそらく、ヘッダーを古い gcc と互換性を持たせ、厳密な ANSI C++ 定義に対応させるためです。問題は、 --std=c++11 が__STRICT_ANSI__マクロを設定していることです。

にコメントしましたが#define __attribute__(spec)、コンパイルは正常に機能しました。

システム ヘッダーにコメントを付けることは実際的ではないため、g++ --std=gnu++11代わりにg++ --std=c++11as it not defined を使用することで回避できます__STRICT_ANSI__。私の場合はうまくいきました。

gcc のバグのようです。

于 2015-04-03T10:28:08.920 に答える