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++11因为它没有定义__STRICT_ANSI__. 它在我的情况下有效。

这似乎是 gcc 中的一个错误。

于 2015-04-03T10:28:08.920 回答
2

想到两件事:

1)extern "C"标题中缺少它,这并不罕见。

2) 数据对齐有问题。可能您正在使用 STL 容器来存储 SSE 类型,这不能保证这些类型的对齐。在这种情况下,您应该实现自定义分配器,它将使用 alligned_malloc。但我认为在这种情况下它应该编译得很好,但在运行时会给你段错误。但是谁知道编译器现在可以检测到什么 :)

以下是您可能想阅读的关于该主题的内容:关于内存对齐关于自定义分配器

ps你的一段代码会很好

于 2013-09-27T05:43:02.910 回答