gcc 4.8.1:将c代码与c ++ 11代码相结合

时间:2013-09-27 05:07:29

标签: c gcc c++11

我没有花太多精力去发现原因,但是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>

然后所有编译都很好。

有人启发我了解发生了什么?

3 个答案:

答案 0 :(得分:3)

这是一个已知的错误,显然有些标题在正确的位置缺少extern "C"声明:

  

我刚刚在Windows上遇到了GCC 4.7.2这个问题。似乎所有intrin.h头文件都缺少extern“C”部分。由于函数始终是内联的,因此符号永远不会显示在任何地方,这在以前不是问题。但是现在另一个标题第二次声明这些函数必须要做的事情。

答案 1 :(得分:3)

我遇到了同样的问题。因为它真的很烦人,我把它砍成了<argp.h>

这是代码(在标准gcc头文件argp.h中),它在ubuntu 14.04 / gcc 4.8.2上触发错误:

/* 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中的一个错误。

答案 2 :(得分:2)

我想到了两件事:

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

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

以下是您可能想要阅读的有关该主题的内容:About memory alignment; About custom allocators

P.S。你的一段代码会很好