问题标签 [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 投票
2 回答
772 浏览

runtime-error - 使用 blas、lapack 和 openmp 的 C 代码与 gcc 4.9 一起使用,但在 gcc 6 中出现运行时错误

我用 C 写了一段代码。

您可以在此处找到源代码。

它利用了库 blas、lapack 和 openmp。

我按照这些说明编译了 blas 和 lapack 库。

我使用这些标志来告诉编译器它应该链接的库:-lblas -llapack -fopenmp.

我正在使用gcc 4.9,程序可以正常运行。

最近我将 gcc 更新到 gcc 6,它显示了许多关于 blas 和 lapack 函数的隐式声明的警告消息:

当我运行应用程序时,会出现分段错误错误。

我完全迷失了 gcc 4.9 和 gcc 6 的区别,你知道对此有什么解释吗?

0 投票
0 回答
260 浏览

c++ - GCC 6.1 显式模板实例化为默认构造函数提供未定义符号

把它放在一个名为 t.hpp 的文件中:

这在 t.cpp 中:

然后构建它(在 Linux 上):

然后查看共享对象中的构造函数:

如果你用 GCC 4.9 编译它应该什么都不显示。对于 GCC 5.1 或 5.3,它应该显示如下内容:

但在 GCC 6.1 中,它显示如下:

这意味着地图的默认构造函数不会在共享对象中发出,尽管它需要发出。这会导致稍后在可执行文件中使用共享对象时链接失败。

如果您使用-O1或更高版本进行编译,问题就会消失(构造函数是内联的)。

中的显式模板实例化似乎t.cpp被 中的非隐式声明所禁止t.hpp。我想出的一种解决方法是#define SOMETHINGt.cpp之前#include "t.hpp"使用in#ifndef SOMETHING来保护t.hpp. 但在版本 6 之前的 GCC 中,这不是必需的,我不确定它是否应该如此。

这是 GCC 6.1 中的错误吗?还是代码错了?

编辑:我发现了这个错误:https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=57728这可能是相关的,但它是针对 GCC 4.8 报告的,而我的问题直到 6.1 才出现。GCC 5.1 vs 4.9 确实引入了一个空默认构造函数,= default而不是多参数的默认参数,但同样,直到 GCC 6.1 才出现我的问题。

0 投票
1 回答
4282 浏览

cuda - 将 CUDA 8.0 与 GCC 6.x 一起使用 - 错误的函数重载投诉

我正在尝试使用我的发行版的默认编译器 GCC 6.2.1 构建一些 CUDA 代码(注意:不是 CUDA 正式支持的 GCC 版本,因此您可以将此称为实验性版本)。这是与 GCC 4.9.3 以及 CUDA 版本 7.5 和 8.0 一起构建的代码。

好吧,如果我构建以下(接近)最小示例:

使用命令行

我收到以下错误:

这是为什么?我怎样才能纠正/规避这个?

0 投票
0 回答
149 浏览

xcode - XCODE GCC6 兼容性

我使用自制软件下载了最新版本的 GCC (6.2.0)。它在命令行中工作得很好(你必须确保你真的使用它而不是 XCODE 所做的 g++ 覆盖)

如果我试图告诉 XCODE 使用这个版本的 GCC 作为编译器,它会说它不兼容。

我是不是下载错东西了?这仅仅是因为它太新了吗?

0 投票
0 回答
316 浏览

gcc - 是否存在或将存在 target_clones 属性的“全局”版本?

我最近玩过target_clonesgcc 6.1 及更高版本中可用的属性。它非常漂亮,但是,就目前而言,它需要一种有点笨拙的方法;每个想要多版本化的函数都必须手动声明一个属性。这不是最优的,因为:

  • 它将编译器特定的东西放入代码中。
  • 它要求开发人员确定哪些功能应该接受这种处理。

让我们举个例子,我想编译一些代码,这些代码将利用可用的 AVX2 指令。-fopt-info-vect会告诉我哪些函数是矢量化的,如果我用 构建-mavx2,那么编译器已经知道这一点。有没有办法在全局范围内告诉编译器:“如果您发现一个您认为可以使用 AVX2 优化的函数,请制作该函数的多个版本,包括和不包括 AVX2。”?如果没有,我们可以有一个,好吗?

0 投票
1 回答
432 浏览

c++ - std::unique_ptr 的实现::在 gcc 6 中重置

unique_ptr<T[]>::reset由于 C++ 中的 GCC 6,方法(不是仅接受的方法)的声明/定义nullptr_t如下所示:

这在某些时候进行了更改以实施N4089。根据该文件:

此函数的行为与主模板的重置成员相同,除了它不应参与重载决议,除非

U与 的类型相同pointer,或

pointer与 的类型相同element_type*U是指针类型V*,并且V(*)[]可以转换为element_type(*)[]

让我们考虑以下示例:

由于版本 6 GCC 产生错误,抱怨它不能std::swapconst char*&and调用char*&reset方法发生在char[]可转换为的重载决议中const char[],但自然会std::swap等待相同类型的两个引用。

这被认为是正确的行为吗?如果是这样,那为什么?如果我可以隐式转换char[]const char[],为什么不能使用unique_ptr

0 投票
1 回答
691 浏览

gcc - gcc 6.2.0 正在尝试创建不应该的共享对象?

在 gcc 6.2.0 之前,使用不可重定位的汇编代码链接从来都不是问题。我不知道盯着这个的确切版本,但是使用 gcc 5.4.0(及更低版本)这个工作:

但是,使用 gcc 6.2.0:

试图强制静态链接会产生另一个问题:

使用 gethostbyname() 时程序会出现段错误(但其他情况下也可以)

尝试混合静态和动态也行不通。

有任何想法吗?项目链接:https ://github.com/niryeffet/ribs2

0 投票
1 回答
3408 浏览

c++ - Valgrind 报告 Mismatched free() / delete / delete []

我正在编写一个可以在多个系统上运行的库(其中一些没有标准库malloc或标准库)。在我的标准库(不同的库)中,我重写了newanddelete运算符来对函数进行通用调用(这个例子没有这些函数)。每个系统都会覆盖这些对它们各自内存分配设备的通用调用。

问题是当我尝试这样做时。这是一些简化的示例代码来重现该问题:

当我使用普通gcc-6(无参数)构建它并使用(无参数)运行时valgrind,我收到此错误:

看来delete操作员工作正常,但 Valgrind 正在覆盖我被覆盖的new操作员。知道如何解决这个问题吗?

删除中间函数不是一种选择,因为我在那里有其他代码。

它如何在我的真实程序上工作的示例(同样,我的示例中没有显示):

我正在使用 gcc v6.2.0、valgrind v3.12.0 和 Ubuntu 16.10。

0 投票
3 回答
26337 浏览

c - 如何告诉 gcc 禁用结构内的填充?

我不确定它是正常的还是编译器错误,但我有一个包含很多成员的 C 结构。其中,有:

我很难找出为什么我的程序不工作,但我终于发现两者之间有 2 个字节的间隙hlti它被设置为 0x0。这意味着i正在对齐。
当我 printf 结构的那部分时,这一点非常清楚,因为使用:

EBF40000EB90EB90在屏幕上。

volatile struct list data;在我的程序中尝试了类似的东西,但它并没有改变对齐问题。

那么是否有 a#pragma或 a__attribute__告诉 gcc 不对齐i内部struct list类型?

0 投票
1 回答
562 浏览

c++ - std::complex 之间的类型不匹配在 C++ 和 complex*16 中,在 gcc 6 下的 Fortran 中,具有链接时优化

我使用了一些从 C++ 调用 Fortran 例程的科学计算代码,它突然开始在 gcc 6 下发出警告。这是准系统问题:

mult考虑定义在 中的 Fortran 子例程mult.f90

我从 C++ 文件中调用它test.cpp

当我使用 g++-6 编译文件时,我收到以下警告:

如果我执行以下任何操作,警告就会消失:

  • 将 g++-6(我的版本是 6.2.0)替换为 g++-5(版本 5.4.1)
  • -flto不带标志编译
  • 使用 double(而不是 std::complex)和 real*8(而不是 complex*16)

我应该担心,还是我可以忽略这个警告?在前一种情况下,我该如何解决这个问题?