问题标签 [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.
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 SOMETHING
在t.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 才出现我的问题。
cuda - 将 CUDA 8.0 与 GCC 6.x 一起使用 - 错误的函数重载投诉
我正在尝试使用我的发行版的默认编译器 GCC 6.2.1 构建一些 CUDA 代码(注意:不是 CUDA 正式支持的 GCC 版本,因此您可以将此称为实验性版本)。这是与 GCC 4.9.3 以及 CUDA 版本 7.5 和 8.0 一起构建的代码。
好吧,如果我构建以下(接近)最小示例:
使用命令行
我收到以下错误:
这是为什么?我怎样才能纠正/规避这个?
xcode - XCODE GCC6 兼容性
我使用自制软件下载了最新版本的 GCC (6.2.0)。它在命令行中工作得很好(你必须确保你真的使用它而不是 XCODE 所做的 g++ 覆盖)
如果我试图告诉 XCODE 使用这个版本的 GCC 作为编译器,它会说它不兼容。
我是不是下载错东西了?这仅仅是因为它太新了吗?
gcc - 是否存在或将存在 target_clones 属性的“全局”版本?
我最近玩过target_clones
gcc 6.1 及更高版本中可用的属性。它非常漂亮,但是,就目前而言,它需要一种有点笨拙的方法;每个想要多版本化的函数都必须手动声明一个属性。这不是最优的,因为:
- 它将编译器特定的东西放入代码中。
- 它要求开发人员确定哪些功能应该接受这种处理。
让我们举个例子,我想编译一些代码,这些代码将利用可用的 AVX2 指令。-fopt-info-vect
会告诉我哪些函数是矢量化的,如果我用 构建-mavx2
,那么编译器已经知道这一点。有没有办法在全局范围内告诉编译器:“如果您发现一个您认为可以使用 AVX2 优化的函数,请制作该函数的多个版本,包括和不包括 AVX2。”?如果没有,我们可以有一个,好吗?
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::swap
用const char*&
and调用char*&
。
reset
方法发生在char[]
可转换为的重载决议中const char[]
,但自然会std::swap
等待相同类型的两个引用。
这被认为是正确的行为吗?如果是这样,那为什么?如果我可以隐式转换char[]
为const char[]
,为什么不能使用unique_ptr
?
gcc - gcc 6.2.0 正在尝试创建不应该的共享对象?
在 gcc 6.2.0 之前,使用不可重定位的汇编代码链接从来都不是问题。我不知道盯着这个的确切版本,但是使用 gcc 5.4.0(及更低版本)这个工作:
但是,使用 gcc 6.2.0:
试图强制静态链接会产生另一个问题:
使用 gethostbyname() 时程序会出现段错误(但其他情况下也可以)
尝试混合静态和动态也行不通。
有任何想法吗?项目链接:https ://github.com/niryeffet/ribs2
c++ - Valgrind 报告 Mismatched free() / delete / delete []
我正在编写一个可以在多个系统上运行的库(其中一些没有标准库malloc
或标准库)。在我的标准库(不同的库)中,我重写了new
anddelete
运算符来对函数进行通用调用(这个例子没有这些函数)。每个系统都会覆盖这些对它们各自内存分配设备的通用调用。
问题是当我尝试这样做时。这是一些简化的示例代码来重现该问题:
当我使用普通gcc-6
(无参数)构建它并使用(无参数)运行时valgrind
,我收到此错误:
看来delete
操作员工作正常,但 Valgrind 正在覆盖我被覆盖的new
操作员。知道如何解决这个问题吗?
删除中间函数不是一种选择,因为我在那里有其他代码。
它如何在我的真实程序上工作的示例(同样,我的示例中没有显示):
我正在使用 gcc v6.2.0、valgrind v3.12.0 和 Ubuntu 16.10。
c - 如何告诉 gcc 禁用结构内的填充?
我不确定它是正常的还是编译器错误,但我有一个包含很多成员的 C 结构。其中,有:
我很难找出为什么我的程序不工作,但我终于发现两者之间有 2 个字节的间隙hlt
,i
它被设置为 0x0。这意味着i
正在对齐。
当我 printf 结构的那部分时,这一点非常清楚,因为使用:
我EBF40000EB90EB90
在屏幕上。
我volatile struct list data;
在我的程序中尝试了类似的东西,但它并没有改变对齐问题。
那么是否有 a#pragma
或 a__attribute__
告诉 gcc 不对齐i
内部struct list
类型?
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)
我应该担心,还是我可以忽略这个警告?在前一种情况下,我该如何解决这个问题?