问题标签 [gcc11]
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++ - 在 (K)ubuntu 20.04 上使用 GCC11
我想使用一些在尚未发布的 GCC-11 中实现的新 C++20 函数。我尝试在 Ubuntu 20.04 上安装该软件包,但正如预期的那样,它还不存在。网络搜索也没有提供任何有用的信息。
有没有办法在 Ubuntu 20.04 上使用 GCC-11?
ubuntu - gcc-11 何时会出现在 Ubuntu 存储库中?
GCC 11.1 终于在昨天发布了。但是,现在它只能从源代码构建,所以我想知道我们什么时候可以得到它apt
?
c - 如何在 GCC 11.1 -mgeneral-regs-only' -Wattributes 在 ARM 架构的中断上下文中禁用警告?
我已将 GCC 编译器从 10.3 更新到 11.1。我用它来编译带有 FPU 的目标 CPU cortex-m4。
在我的代码中,有很多函数标记为中断,__attribute__((interrupt))
例如:
不幸的是,更新后,编译器已经开始为中断属性生成警告
这里出现的问题是如何关闭此警告。我不想禁用-Wattributes
我只想针对这种特殊情况禁用警告。
还有什么为什么 GCC 试图禁止在中断服务程序上使用 FPU 上下文?它在 ARMv7m 架构的中断上下文中是允许的,并且在硬件中支持。
我想这是GCC中的一个错误?
c++ - 如何通过编译标志包含头文件?
我已经切换到 GCC 11。版本 11 的一个变化是一些 C++ 标准库头文件已更改为不再包含它们确实需要依赖的其他头文件。(此处称为“标题依赖项更改”:https ://gcc.gnu.org/gcc-11/porting_to.html )。
现在,当我想编译一个用 GCC 10 编译得很好的大型 3rd 方库时,由于缺少头文件包含,我得到了编译错误。作为一种快速解决方法,我想在编译该库时自动包含移植说明中提到的四个头文件
<limits>
,
<memory>
,
<utility>
,
<thread>
但我不想修补它的源代码。
那可能吗?是否可以通过传递一些编译标志,因为这很容易在构建过程中修改?或者是否有另一种简单的解决方法来丢失包含文件?
clang - 主流编译器是否支持 OMPT?
5.0 版的 OpenMP 规范定义了OMPT接口以允许外部工具查询 openmp 运行时。
我想试一试,但我对主流编译器实际上如何支持这一点感到非常困惑。
GCC-11 声称已经扩展了对 openmp 5.0 的支持,但是关于 OMPT,我找不到相应的
ompt.h
头文件(在我的例子中,Ubuntu 软件包libgcc-11-dev
提供了omp.h
)。clang-12 确实提供了
ompt.h
(package ) 但是示例程序libomp-12-dev
的编译失败,第一个错误是并且确实在.unknown type name 'ompt_invoker_t'
ompt.h
目前的支持状态对我来说非常不清楚。我找不到 GCC 的准确状态,而 clang 提供了这些信息https://clang.llvm.org/docs/OpenMPSupport.html从中我无法弄清楚大部分完成的背后是什么。
谁能帮我找到最新信息或任何提示?
c++ - C++ 模块从另一个模块转发声明实体
我最近一直在尝试使用 GCC 11 将代码库转换为 C++20 模块。但是,我陷入了以下情况。首先,这是使用标题的方法:
啊
A.cpp
(这里Bh的内容不重要)
需要注意的是 B 的前向声明。不是每个使用 A 的人都应该关心 B,所以我使用前向声明来阻止重新编译的发生。使用标头,这种情况非常有效。
问题在于尝试将此代码转换为模块时。主要问题是实体与声明它们的模块相关联,因此在 Ah 中进行前向声明是不可能的。我尝试在全局模块中进行前向声明,但编译器仍然抱怨 B 的定义与其声明位于不同的模块中。我还尝试了第三个模块,它只包含 B 的前向声明,但这仍然是在两个不同的模块中声明和定义 B。所以,我的主要问题是:我怎样才能从模块之外的模块中转发声明一些东西? 我也会对最终产生相同效果的方式感到满意:当 B 更改时,A 的用户不需要重新编译。
在搜索时,我发现一些地方在谈论类似的情况,但由于某种原因它们都不起作用。他们没有工作的原因:
- 有人说有一个带有前向声明的模块。正如我上面所说,这不起作用。
- 有人说要使用宣布的所有权声明。但是,它们已从最终的 C++ 标准中删除。
- 有人说使用模块分区。但是,这仅在 A 和 B 在同一模块中时才有效。A 和 B 不应该在同一个模块中,所以这不起作用。
编辑:作为对评论的回应,以下是我尝试过的一些事情的详细信息:
尝试 1:在 A.mpp 中转发声明 B
A.mpp
B.mpp
A.cpp
执行此操作时,gcc 错误
尝试 2:在新模块中前向声明
B_decl.mpp
A.mpp
B.mpp
A.mpp
执行此操作时,gcc 错误
尝试 3:在标头中前向声明,在模块中定义
B_decl.h
A.mpp
B.mpp
A.cpp
执行此操作时,gcc 错误
c++ - 在 C++ 中编译 sio_client 和 semaphore
我可以编译一个只使用信号量的程序或一个只使用 sio_client websocket 库的程序。但是,当编译一个包含这两个库的简单程序时,我会处理我什至不知道如何描述的巨大编译问题。
如果我用 <sio_client.h> 替换包含“socket.io-client-cpp/src/sio_client.h”,则编译器找不到 sio_client 库,并且如果我手动包含库路径,因为它在代码中,误差比圣经还大。
需要指出的是,我根据库本身包含的 README.md 进行了 sio_client 安装过程,并且我已经在其他上下文中使用过它,效果很好。
要编译这个程序,我使用以下命令:
错误的开始:
c++ - arm64 debian 上的 gcc-8 是否忽略友元运算符
我想比较两组对象。对于相同的代码,我在不同的机器上得到 2 个不同的输出。代码是用两个不同的编译器编译的。在x86-64机器上我使用gcc-11,在aarch64 ( raspberry pi4 ) 机器上我使用gcc-8。我必须在
我想比较两组对象。对于相同的代码,我在不同的机器上得到 2 个不同的输出。代码是用两个不同的编译器编译的。在x86-64机器上我使用gcc-11,在aarch64 ( raspberry pi4 ) 机器上我使用gcc-8。我必须在树莓上使用gcc-8 ,因为它在官方存储库中。
有谁知道为什么会这样?我错过了什么吗?
x86-64输出。
aarch64输出:
问题在这里:
共享指针有自己的比较运算符,用于比较存储的指针。还有owner_less比较拥有的指针(一个特殊构造的共享指针可以拥有一个对象但指向另一个对象,例如它可以指向拥有对象的成员)。
如果你需要比较指向的对象,你应该写一个比较器来做这件事,并将它作为第二个模板参数传递给集合。像:
我想比较两组对象。对于相同的代码,我在不同的机器上得到 2 个不同的输出。代码是用两个不同的编译器编译的。在x86-64机器上我使用gcc-11,在aarch64 ( raspberry pi4 ) 机器上我使用gcc-8。我必须在
我想比较两组对象。对于相同的代码,我在不同的机器上得到 2 个不同的输出。代码是用两个不同的编译器编译的。在x86-64机器上我使用gcc-11,在aarch64 ( raspberry pi4 ) 机器上我使用gcc-8。我必须在树莓上使用gcc-8 ,因为它在官方存储库中。
有谁知道为什么会这样?我错过了什么吗?
x86-64输出。
aarch64输出:
问题在这里:
共享指针有自己的比较运算符,用于比较存储的指针。还有owner_less比较拥有的指针(一个特殊构造的共享指针可以拥有一个对象但指向另一个对象,例如它可以指向拥有对象的成员)。
如果你需要比较指向的对象,你应该写一个比较器来做这件事,并将它作为第二个模板参数传递给集合。像:
c++ - Boost 概念检查警告
鉴于此代码使用 boost 1.75 / gcc 11
我收到很多警告,例如 boost concept failed ...
更多日志:
https://godbolt.org/z/6Ge5vxYrc
如果我没有能力升级提升,如何解决这个问题
c - gcc-11 不正确可能会在未初始化的情况下使用,这似乎很难避免
我发现了一个特定的使用模式,它看起来完全没问题,以前没有编译器抱怨过。现在它使用 gcc-11 发出警告:下面是一个接近最小的示例。另存为t.c
并使用gcc-11 -O2 -Wall -c t.c
.
编译结果:
现在有一些观察
- 调用 strlen(s) 而不是 f(s) 不会导致警告。请注意,两者都接受
const char*
(签入/usr/include/string.h
) - 如果我删除 的
const
声明中的f()
,问题也会消失。 - 调用 using
f((const char*)s)
也无济于事。 - 像 in 一样初始化 s
char *s = NULL
也无济于事(无论如何我都不希望这样做,因为它隐藏了有关未初始化变量的正确警告)。
我了解到,声称某事是 GCC 错误通常被正确地证明是错误的。所以我首先在这里检查我缺少什么。
编辑由于我无法在评论中添加代码,因此这里是反驳部分声明的代码。这编译得很好: