2015-09-13 140 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