GLM и atomic в g 4.8

#c #linux #gcc #g #glm-math

#c #linux #ссагпз #g #glm-математика

Вопрос:

Несколько дней назад я перешел с Windows на Linux, и до сих пор мне это очень нравится. К сожалению, у меня возникли проблемы с переносом моего проекта. Там я использую GLM для векторных вычислений и атомарных вместе взятых. В Visual Studio все работало нормально.

Первая проблема, с которой я столкнулся, заключалась в том, что по какой-то причине g 4.6 выдал мне a undefined referece to , как только я включил atomic заголовок. Затем я переключился на g 4.8, и проблема исчезла. Но теперь, как только я использую atomic с таким вектором : 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.

Ответ №1:

Похоже tvec3<float> , не подходит для создания std::atomic .
Вам нужно проверить tvec3<float> , действительно ли выполняются все ограничения, указанные в TriviallyCopyable концепции:

Требования

  • Тривиальный конструктор копирования
  • Тривиальный конструктор перемещения
  • Тривиальный оператор присваивания копирования
  • Тривиальный оператор присваивания перемещения
  • Тривиальный деструктор
  • Нет виртуальных функций или виртуальных базовых классов
  • Все (нестатические) члены и базовые классы легко копируются

В противном случае используйте отдельный std::mutex для защиты контейнера от одновременного доступа.

Комментарии:

1. Я тоже так думал, но это работало в Visual Studio.

2. Да, я тоже понял это позже, когда перечитал вопрос. Какую версию VS вы использовали? Вполне может быть ошибкой в GCC 4.8, это не полная функция c 11. Попробовать GCC 4.9 звучит как хорошая идея. Для clang это звучит так, что вам не хватало этой -std=c 11 опции.

3. Я использовал VS2012. Я также подумал, что это может быть ошибкой, но я не могу найти gcc 4.9. Я попытался установить -std=c 11 с помощью clang, и я получаю новую ошибку. Где-то в ‘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'?|

4. Только что увидел, что clang использует библиотеки c 4.6. Я пытаюсь установить его в библиотеки 4.8.