c++ - G++ 4.8 中的 GLM 和原子

标签 c++ linux gcc g++ glm-math

我几天前从 Windows 切换到 Linux,到目前为止非常喜欢它。不幸的是,我在移植我的项目时遇到了问题。在那里,我将 GLM 用于 vector 计算和原子运算。在 Visual Studio 上一切正常。

我遇到的第一个问题是,出于某种原因,g++ 4.6 给了我一个 undefined referece to我一包括atomic header 。然后我切换到 g++ 4.8,问题就消失了。但是现在,一旦我使用带有这样一个 vector 的原子:atomic<vec3> ,我遇到了一个新问题。这就是 g++ 所说的:

/usr/include/c++/4.8/atomic|167|error: function ‘std::atomic<_Tp>::atomic() [with _Tp = glm::detail::tvec3<float>]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘std::atomic<glm::detail::tvec3<float> >::atomic()’|

我不知道如何解决这个问题。我想尝试 g++ 4.9,但我什至不知道如何获得它。这是一个简单的代码,它在我的机器上崩溃了:

#include <iostream>
#include <glm.hpp>
#include <atomic>

using namespace std;
using namespace glm;

atomic<vec3> b;
int main(){
    cout << "hello" << endl;

    return 0;
}

我正在使用 Code::Blocks 作为 IDE。当我使用 clang++ 时,我得到了与 g++ 4.6 相同的错误。

最佳答案

看起来像tvec3<float>不适合制作 std::atomic .
您需要检查是否 tvec3<float>实际上满足 TriviallyCopyable 给出的所有限制条件理念:

要求

  • 普通复制构造函数
  • 简单的移动构造函数
  • 普通复制赋值运算符
  • 平凡的移动赋值运算符
  • 平凡的析构函数
  • 没有虚函数或虚基类
  • 所有(非静态)成员和基类都是 TriviallyCopyable

否则使用单独的 std::mutex 保护容器免受并发访问。

关于c++ - G++ 4.8 中的 GLM 和原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24493752/

相关文章:

c++ - 查找 "cannot access private member declared in class ' QObject 的根本原因'”

linux - Perl 期望代码不适用于设置密码

c++ - Qt utf8 编码在 Windows 上失败,但在 Linux 上运行良好

c++ - Festival TTS API/CodeBlocks 构建问题!

C:如何摆脱转换错误?

multithreading - 编译时 -pthread 和 -lpthread 之间的区别

c++ - 将 const char 转换为 char 时出现未处理的异常

c++ - "clang -S -emit-llvm file.cpp"是否运行除 clang 之外的任何其他可执行文件?

c++ - 在 C++ 中使用指针时,对象属性未按预期更改

python - 无法解析参数