【问题标题】:GLM and atomic in g++ 4.8g++ 4.8 中的 GLM 和 atomic
【发布时间】:2014-06-30 15:31:30
【问题描述】:

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

我遇到的第一个问题是,由于某种原因,g++ 4.6 在我包含atomic 标头后立即给了我一个undefined referece to。然后我切换到 g++ 4.8,问题就消失了。但是现在,只要我使用带有这样矢量的原子: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 相同的错误。

【问题讨论】:

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


    【解决方案1】:

    看起来tvec3&lt;float&gt; 不适合制作std::atomic
    您需要检查tvec3&lt;float&gt; 是否真的满足TriviallyCopyable 概念给出的所有约束:

    要求

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

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

    【讨论】:

    • 我也这么认为,但它适用于 Visual Studio。
    • 是的,我后来在重读这个问题时也意识到了这一点。你用的是哪个VS版本?很可能是 GCC 4.8 中的一个错误,它不是 c++11 功能完整的。尝试 GCC 4.9 听起来是个好主意。听起来你错过了-std=c++11 选项。
    • 我用的是VS2012。我还认为这可能是一个错误,但我找不到 gcc 4.9。我尝试使用 clang 设置 -std=c++11,但出现新错误。在“atomic_base.h”的某个地方,clang 说:/usr/include/c++/4.6/bits/atomic_base.h|167|error: no template named '__atomic_base'; did you mean '__atomic0::__atomic_base'?|
    • 刚刚看到clang使用的是c++的4.6库。我尝试将其设置为 4.8 库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2013-10-05
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多