Проблемы с включением / использованием библиотеки GLM

У меня возникли проблемы с правильным включением / использованием математической библиотеки glm (http://glm.g-truc.net/) в мой проект c ++. Поскольку glm - это библиотека, предназначенная только для заголовков, я подумал, что могу просто включить ее в эту строку:

#include "glm/glm.hpp"

Сначала это казалось работающим, поскольку я мог создавать и использовать матрицы и векторы. Однако, когда я попытался использовать функцию glm::translate(...), я получил эту ошибку:

error: ‘translate’ is not a member of ‘glm’

На сайте GLM рекомендуют включать библиотеку в треугольные скобки, например:

#include <glm/glm.hpp>

... но разве не правильно думать, что я могу включить его другим способом, учитывая, что он находится внутри структуры каталогов проекта?

Я настроил тест ниже, чтобы проиллюстрировать мою проблему. Папка glm находится рядом с файлом testglm.cpp.

#include <iostream>

#include "glm/glm.hpp"

using namespace std;

int main(void) {

    // works:
    glm::mat4 testMatrix1 = glm::mat4(5.0f) * glm::mat4(2.0f);

    cout << testMatrix1[0][0] << endl; // output: 10

    // doesn't work - (error: ‘translate’ is not a member of ‘glm’):
    glm::mat4 testMatrix2 = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f));

}

Я создаю этот тест с помощью этой команды сборки из терминала в osx:

g++ -o bin/glm_test src/testglm.cpp

Я не уверен, связана ли моя проблема с тем, как я включаю библиотеку, как я ее использую или как я создаю проект. Google не дает мне никаких обращений к этому сообщению об ошибке, поэтому мне интересно, делаю ли я что-то в корне неправильно. Совет будет очень признателен. Спасибо.


person null    schedule 11.10.2013    source источник


Ответы (4)


Предложение yngum побудило меня более внимательно изучить документацию, и я понял, что glm::translate на самом деле является частью модуля, расширяющего ядро ​​glm. Мне нужно было включить как ядро ​​glm, так и расширение matrix_transform:

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"

Теперь тестовый пример работает. (Я также заметил, что я также сделал глупую ошибку в тесте, которая помешала бы его компиляции. Теперь это исправлено в исходном вопросе для будущих читателей, которые могут столкнуться с проблемой, которая возникла у меня по той же причине. )

person null    schedule 12.10.2013

Может, я немного опоздал, но вместо

#include "glm/glm.hpp"

можно было бы использовать

#include "glm/ext.hpp"
person Tqq    schedule 18.01.2017

убедитесь, что у вас есть правильные аргументы, или используйте IDE, чтобы упростить себе жизнь.
вот glm::translate подписи, которые я могу найти

detail::tmat4x4<T> translate (detail::tmat4x4<T> const &m, detail::tvec3<T> const &v);
detail::tmat4x4<T> translate (T x, T y, T z)
detail::tmat4x4<T> translate (detail::tmat4x4<T> const &m, T x, T y, T z)
detail::tmat4x4<T> translate (detail::tvec3<T> const &v)
person yngccc    schedule 11.10.2013
comment
Спасибо, что нашли время ответить. Вы были правы, что у меня был дополнительный аргумент при вызове translate() - опечатка, когда я пробовал функцию rotate(). Однако это не было реальной причиной проблемы, поскольку translate фактически находится в расширении, которое я не включил. Я решил исправить опечатку и ответить на свой вопрос, так как думаю, что это будет иметь большую практическую ценность для будущих читателей, ищущих эту ошибку в Google. +1 за то, что заставил меня более внимательно изучить документы. Спасибо. - person null; 12.10.2013
comment
Кстати, я бы, конечно, использовал ide для серьезных проектов, но сейчас я заставляю себя научиться писать Makefile. Я думаю, что это ценное упражнение, которое в конечном итоге окупится тем, что вы избежите боли и страданий. - person null; 12.10.2013

Напишите в терминале:

sudo apt install libglm-dev

Это сработало для меня.

person Marco Patiño    schedule 18.02.2020
comment
Похоже, это не ответ на вопрос. OP, похоже, уже успешно установил glm и может включать соответствующие файлы заголовков, включенные в этот пакет. - person Brian; 18.02.2020