问题标签 [gcc6]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3737 浏览

c - gcc 无法在没有 -O2 的情况下内联函数

我最近在升级 debian 测试并获得 gcc 6.2.1 编译器后编译一段代码时遇到了问题。我把它归结为这个简单的例子:

该代码无法使用以下内容进行编译:

gcc -o exec code.c # gcc 6.2.1

它失败了:

undefined reference to 'func'

我也在同一台主机上尝试过使用 gcc 4.8、4.9 和 5,但都失败了。如果我添加它会编译:

gcc -o exec code.c -O2 # gcc 6.2.1

我真的很好奇为什么它可以与 -O2 标志一起使用,但并非没有,我希望这可以工作?

0 投票
0 回答
152 浏览

doxygen - Doxygen 1.8.11 构建失败并出现 gcc620

我已经看到了 doxygen 所需的所有软件包及其版本,但是使用 gcc620 构建失败并出现以下错误:

请帮忙。

0 投票
1 回答
1667 浏览

c++ - Why does GCC 6 assume data is 16-byte aligned?

(Sorry in advance for not having managed to reduce my problem to a simple failing test case...)

I have faced issues with upgrading to GCC 6.3.0 to build our codebase (relevant flags: -O3 -m32).

Specifically, my application segfaults within a struct ctor call because of GCC optimizations.

In this ctor, GCC used movaps :

movaps requires the operand to be 16-byte aligned. But at this point in time, %ebx points to my object, which is not necessarily 16-byte aligned. From glibc :

“The address of a block returned by malloc or realloc in GNU systems is always a multiple of eight (or sixteen on 64-bit systems).“</p>

Hence the segfault (when built with -O3 -m32).

Why does it seem like GCC assumed the allocated object would be 16-byte aligned ? Am I misunderstanding something ?

Notes:

  • No alignment hints or attributes on this struct
  • Object has been initialized via default new operator
  • Depends on the level of optimization:
    • PASS: -m32 -O2
    • FAIL: -m32 -O2 -ftree-slp-vectorize
    • PASS: -m32 -O3 -fno-tree-slp-vectorize
    • FAIL: -m32 -O3

This other project, seem to have hit similar issues : https://github.com/godotengine/godot/issues/4623

Their investigation points to -fvect-cost-model=dynamic. Investigation on my codebase rather points to -ftree-slp-vectorize.

0 投票
2 回答
159 浏览

c++ - gcc 6.1 std::result_of 编译错误

考虑一个小的独立用例,其中我想确定一个类型是完整的还是不完整的

gcc 4.9.3这与带有--std=c++11标志的编译很好。但是,使用gcc 6.1and它会--std=c++11产生编译错误

我在这里想念什么?有什么可能的解决方法?

0 投票
0 回答
72 浏览

c++ - 我可以链接 GCC 5.4.x 和 6.x 从 C++ 编译的对象吗?

出于某种原因,我有一些用 GCC 5.4.x 编译的目标文件和一些用 GCC 6.x 编译的目标文件。源代码是 C++14,我在运行 GNU/Linux 4.4.x 的 x86_64 机器上。

有没有可能将我的对象链接在一起?如果是这样,它可能的限制/条件是什么,或者我需要遵循什么程序才能使它成为可能?

0 投票
1 回答
183 浏览

c++ - 在 gcc 中使用 fsanitize 开关的 Boost 问题

我一直在尝试利用一些GCC Instrumentation Options进行运行时检查,以尝试调试/诊断我在 C++ 代码的特定区域中遇到的问题。

为了尝试缩小问题范围,我开始启用其中一些功能,但在我没有预料到的代码区域中遇到了错误——即在 Boost 库中。

当我使用 gcc 开关 '-fsanitize=undefined' 时,我注意到 gdb 报告了许多运行时错误;我似乎能够毫不费力地重现这些错误。我在下面提供了一些示例代码。

环境配置:

  • Ubuntu v16.10 (Yakkety) x86_x64
  • Boost v1.61(使用 apt-get)
  • GCC 6.3.0(最近从源代码构建,但来自 apt-get 的版本出现问题)
  • GDB 7.11.90
  • CMake v3.7(来自 cmake 网站)

示例代码如下:

CMakefile 看起来像:

GDB 示例输出:

在对我的发现进行了一些思考后,我收集了一些问题:

  1. 这是编码错误吗?
  2. 这让你们感到惊讶吗?
  3. 这些错误是误报吗?
  4. 你们中有人使用“-fsanitize”开关吗?
  5. 我应该尝试更新版本的 Boost(即从源代码构建的 v1.63)吗?
  6. 我可以在我的系统上同时安装 v1.61 和 v1.63(但只能链接到其中一个)吗?
0 投票
0 回答
2042 浏览

c++ - 错误:reinterpret_cast 从整数到指针

以下代码无法使用 GCC 6 和 32 位模式(在 amd64 主机上)编译。

编译命令:

错误信息是:

它适用于较旧的编译器(GCC 4.9)。它也可以作为内联定义(而不是静态成员变量)或在 64 位模式下编译。

有没有办法让它与 GCC 6 一起工作?

0 投票
2 回答
1083 浏览

gcc - gcc -fPIC -fPIE:gcc-4 和 gcc-6 之间的区别

序言:这个问题不是关于 Oracle,而是我想了解 gcc-4 和 gcc-6 在处理位置无关代码方面的根本区别。

所以我决定尝试在 Debian 上安装 Oracle 12c

在与 gcc-6 的链接阶段,会发出如下错误消息:

但是,如果我将编译器切换为使用 gcc-4.9,则所有链接都可以顺利完成。

因此我的2个问题:

  • gcc 版本 4 和 6 之间的 -fPIC 和 -fPIE 的默认值是否有变化?很可能是的,版本 6 似乎默认使用 2 个选项。
  • 对我来说更重要的是:gcc 版本 6 是否可以选择使用版本 4 的行为来生成与位置无关的代码?(或者我迟早会因为 gcc-4 不再可用而无法链接旧库?)
0 投票
1 回答
294 浏览

c++ - Centos6 gcc6:编译简单的c ++ 11测试文件时未拾取默认ABI

我有一个安装了 devtoolset-6 的 centos 6 的 docker 映像,我想使用 中可用的新 ABI 构建我的代码gcc>=5,在这种情况下gcc6。不知何故,我没有得到我期望的默认工作。我尝试了各种变化,但我不知道我错过了什么微不足道的事情。

任何我缺少的建议将不胜感激......

在编译下面的示例代码时,我希望看到:

使用 gcc6构建以下内容Dockerfile会生成一个 centos6 映像:

并运行图像

下面的代码片段没有给出预期的结果

我得到了旧的 ABI 版本,即使 gcc 文档声明默认是生成新的 ABI

即使使用-D_GLIBCXX_USE_CXX11_ABI=1它显式编译仍然会给出不正确的结果:

所以很明显我错过了一些微不足道的东西。

有什么帮助吗?

0 投票
1 回答
2248 浏览

c++ - g++:优化 -march=haswell 和更新的变化数值结果

当我注意到 g++ 似乎会根据选择的优化改变结果时,我一直致力于优化性能,当然还进行了回归测试。到目前为止,我认为-O2 -march=[whatever]无论选择哪种架构,都应该为数值计算产生完全相同的结果。然而,这似乎不是 g++ 的情况。虽然使用一直到 ivybridge 的旧架构产生的结果与 clang 对任何架构的结果相同,但对于 haswell 和更新的 gcc,我得到不同的结果。这是 gcc 中的错误还是我误解了一些关于优化的问题?我真的很吃惊,因为 clang 似乎没有表现出这种行为。

请注意,我很清楚这些差异在机器精度范围内,但它们仍然干扰了我的简单回归检查。

这是一些示例代码:

编译使用:

gcc 版本:6.2.1

铿锵版本:3.8.0

编译为 64 位,在 Intel Skylake 处理器上执行。