2015-09-13 167 views
1

我试图使用GLM作为游戏项目,但是在使用g ++和-std = C++ 11编译时,出现了很多编译错误。GLM无法使用g ++/C++编译11

这是我想要编译代码:(从here拍摄)

#include "glm/vec3.hpp" 
#include "glm/gtx/io.hpp" 
#include <iostream> 

using namespace std; 
using glm::vec3; 

int main() { 
    vec3 i_am_zero; 

    cout << i_am_zero << endl; 
    return 0; 
} 

我的命令行:

g++ -std=c++11 test.cpp -o test.exe 

编译器输出:

In file included from glm/gtx/../detail/func_trigonometric.hpp:205:0, 
       from glm/gtx/../trigonometric.hpp:35, 
       from glm/gtx/../glm.hpp:110, 
       from glm/gtx/io.hpp:50, 
       from glmtest.cpp:2: 
glm/gtx/../detail/func_trigonometric.inl:166:14: error: 'std::asinh' has not been declared 
    using std::asinh; 
      ^
In file included from glm/gtx/../detail/func_trigonometric.hpp:205:0, 
       from glm/gtx/../trigonometric.hpp:35, 
       from glm/gtx/../glm.hpp:110, 
       from glm/gtx/io.hpp:50, 
       from glmtest.cpp:2: 
glm/gtx/../detail/func_trigonometric.inl:185:14: error: 'std::acosh' has not been declared 
    using std::acosh; 
      ^
glm/gtx/../detail/func_trigonometric.inl:206:14: error: 'std::atanh' has not been declared 
    using std::atanh; 
      ^
In file included from glm/gtx/../detail/func_exponential.hpp:132:0, 
       from glm/gtx/../exponential.hpp:35, 
       from glm/gtx/../glm.hpp:111, 
       from glm/gtx/io.hpp:50, 
       from glmtest.cpp:2: 
glm/gtx/../detail/func_exponential.inl:43:14: error: 'std::log2' has not been declared 
    using std::log2; 
      ^
In file included from glm/gtx/../detail/func_common.hpp:455:0, 
       from glm/gtx/../common.hpp:35, 
       from glm/gtx/../glm.hpp:112, 
       from glm/gtx/io.hpp:50, 
       from glmtest.cpp:2: 
glm/gtx/../detail/func_common.inl:229:16: error: 'std::trunc' has not been declared 
    using ::std::trunc; 
       ^
glm/gtx/../detail/func_common.inl:248:16: error: 'std::round' has not been declared 
    using ::std::round; 
       ^
glm/gtx/../detail/func_common.inl: In instantiation of 'vecType<T, P> glm::round(const vecType<T, P>&) [with T = float; glm::precision P = (glm::precision)0u; vecType = glm::tvec2]': 
glm/gtx/../detail/func_packing.inl:47:55: required from here 
glm/gtx/../detail/func_common.inl:262:59: error: no matching function for call to 'glm::detail::functor1<float, float, (glm::precision)0u, glm::tvec2>::call(<unresolved overloaded function type>, const glm::tvec2<float, (glm::precision)0u>&)' 
    return detail::functor1<T, T, P, vecType>::call(round, x); 
                 ^
glm/gtx/../detail/func_common.inl:262:59: note: candidate is: 
In file included from glm/gtx/../detail/func_trigonometric.inl:33:0, 
       from glm/gtx/../detail/func_trigonometric.hpp:205, 
       from glm/gtx/../trigonometric.hpp:35, 
       from glm/gtx/../glm.hpp:110, 
       from glm/gtx/io.hpp:50, 
       from glmtest.cpp:2: 
glm/gtx/../detail/_vectorize.hpp:58:41: note: static glm::tvec2<R, P> glm::detail::functor1<R, T, P, glm::tvec2>::call(R (*)(T), const glm::tvec2<T, P>&) [with R = float; T = float; glm::precision P = (glm::precision)0u] 
    GLM_FUNC_QUALIFIER static tvec2<R, P> call(R (*Func) (T x), tvec2<T, P> const & v) 
             ^
glm/gtx/../detail/_vectorize.hpp:58:41: note: no known conversion for argument 1 from '<unresolved overloaded function type>' to 'float (*)(float)' 
In file included from glm/gtx/../detail/func_common.hpp:455:0, 
       from glm/gtx/../common.hpp:35, 
       from glm/gtx/../glm.hpp:112, 
       from glm/gtx/io.hpp:50, 
       from glmtest.cpp:2: 
glm/gtx/../detail/func_common.inl: In instantiation of 'vecType<T, P> glm::round(const vecType<T, P>&) [with T = float; glm::precision P = (glm::precision)0u; vecType = glm::tvec4]': 
glm/gtx/../detail/func_packing.inl:105:52: required from here 
glm/gtx/../detail/func_common.inl:262:59: error: no matching function for call to 'glm::detail::functor1<float, float, (glm::precision)0u, glm::tvec4>::call(<unresolved overloaded function type>, const glm::tvec4<float, (glm::precision)0u>&)' 
    return detail::functor1<T, T, P, vecType>::call(round, x); 
                 ^
glm/gtx/../detail/func_common.inl:262:59: note: candidate is: 
In file included from glm/gtx/../detail/func_trigonometric.inl:33:0, 
       from glm/gtx/../detail/func_trigonometric.hpp:205, 
       from glm/gtx/../trigonometric.hpp:35, 
       from glm/gtx/../glm.hpp:110, 
       from glm/gtx/io.hpp:50, 
       from glmtest.cpp:2: 
glm/gtx/../detail/_vectorize.hpp:76:41: note: static glm::tvec4<R, P> glm::detail::functor1<R, T, P, glm::tvec4>::call(R (*)(T), const glm::tvec4<T, P>&) [with R = float; T = float; glm::precision P = (glm::precision)0u] 
    GLM_FUNC_QUALIFIER static tvec4<R, P> call(R (*Func) (T x), tvec4<T, P> const & v) 
             ^
glm/gtx/../detail/_vectorize.hpp:76:41: note: no known conversion for argument 1 from '<unresolved overloaded function type>' to 'float (*)(float)' 

它似乎无法从cmath中找到某些功能 - 但如果包含cmath,这些错误仍然存​​在在我包括glm之前。

有什么建议吗?

回答

2

看来这是一个GLM版本0.9.7的bug。降级到0.9.5为我解决了这个问题。它被追踪为issue 405

+0

你也可以在这里链接问题吗? –

+0

当然,请给我一点时间写下来。 – craymen

+0

https://github.com/g-truc/glm/issues/405 – craymen

1

这个编译和运行很好,在我的机器上用C++ 11标准的gcc 4.8.2。

,我收到了一系列警告

/usr/include/glm/gtc/quaternion.inl:639:165: note: #pragma message: GLM: rotate function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message. 

,但如果我的代码更改为

#define GLM_FORCE_RADIANS 
#include "glm/vec3.hpp" 
#include "glm/gtx/io.hpp" 
#include <iostream> 

using namespace std; 
using glm::vec3; 

int main() { 
    vec3 i_am_zero; 

    cout << i_am_zero << endl; 
    return 0; 
} 

然后它编译与-Wall -Werror罚款。

glm标题包括cmath,所以包括它不应该改变你的东西。

我正在使用GLM版本0.9.5。您可能想要升级您的GL​​M版本,可能和/或编译器版本?

+0

我在GLM 0.9.7和g ++ 4.9.3上。我会试用GLM 0.9.5。 – craymen

+1

降级解决了问题。我会将它作为他们的GitHub上的错误提交。感谢你的回答! – craymen