#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.