【发布时间】:2013-10-03 07:11:04
【问题描述】:
我没有花太多精力去发现原因,但是 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 编译良好p>
相比之下,在 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>
然后一切编译正常。
有人启发我了解发生了什么?
【问题讨论】:
-
你的代码中是否使用了任何 stl 容器?
-
能否提供输出:
g++ -E -dM -</dev/null | grep 'SSE\|MMX' -
嗨@Brett。输出为
#define __MMX__ 1 #define __SSE2_MATH__ 1 #define __SSE_MATH__ 1 #define __SSE2__ 1 #define __SSE__ 1 -
@lrleon - 它似乎确实指向一个错误;
<bits/opt_random.h>中的模板代码在#ifdef __SSE3__块内,但<x86intrin.h>,因此<mmintrin.h>,标题仍然包括在内 - 正如其他人指出的那样,缺少#extern "C"范围。如果您的标头顺序破解有效,您可能只需要在代码中添加注释并等待 gcc 4.9 :) -
@lrleon - 但是,所有内部函数都具有
__always_inline__属性,因此extern "C"应该无关紧要。我认为您应该冒着“烦人”的风险再次报告问题,因为似乎很长时间没有采取任何行动。