Я столкнулся с той же проблемой, что и вы, когда пытался скомпилировать пример треугольника в SuperBible (5-е издание).Мне также нравится использовать Code :: Blocks с MinGW.Я проводил некоторые исследования и думаю, что мне удалось решить большинство проблем.
Первое, что нужно сделать, это правильно настроить нашу среду.Мы начнем с настройки библиотек, freeglut и GLTools.
Перед началом работы убедитесь, что у вас установлена последняя версия MinGW с MSYS.Убедитесь, что вы добавили c: / MinGW / bin в переменную path.Также получите хороший экстрактор файлов, такой как 7z, который может распаковать файлы .tar и .gz.
Возможно, я буду слишком подробен, но эти вещи не были очевидны для меня, пока я их не исследовал.
Чтобы настроить freeglut-2.6.0, первое, что мы собираемся сделать, это скомпилировать статическую библиотеку из источника:
Перейти к freeglut's зайдите на сайт и загрузите последнюю версию (в настоящее время 2.6.0)
Создайте каталог ac: / libs и распакуйте туда пакет freeglut.В результате вы должны получить каталог с именем c: /libs/freeglut-2.6.0.
Запустить MSYS (c: /MinGW/msys/1.0/msys.bat).Вы должны быть в вашем домашнем каталоге (обозначается ~ после вашего пользователя и хоста в верхней строке).
Введите "cd /c/libs/freeglut-2.6.0/src"и нажмите [ввод].Символ ~ изменится на /c/libs/freeglut-2.6.0/src для обозначения вашего текущего рабочего каталога.
Введите "gcc -O2 -c -DFREEGLUT_STATIC * .c -I../include "и нажмите [enter].Здесь мы вызываем компилятор gcc, инструктируем его использовать оптимизацию O2, устанавливаем флаг FREEGLUT_STATIC и компилируем каждый исходный файл в этом каталоге в объектные файлы .o, а также ищем заголовки в «../include».Это означает перейти на один уровень вниз (к /c/libs/freeglut-2.6.0) и найти там каталог / include.
Тип "ar rcs libfreeglut32_static.a *.o "и нажмите ввод.Насколько я понимаю, ar - это утилита, которая компилирует статические библиотеки, архивные файлы (.a).Мы говорим ему создавать "libfreeglut32_static.a" из каждого объектного файла (.o), который мы только что скомпилировали на предыдущем шаге.
Создать каталог / lib в / c / libs/freeglut-2.6.0.Затем вырежьте библиотеку, которую мы только что создали, и вставьте ее в этот каталог.Окончательное расположение библиотеки freeglut должно быть "c: /libs/freeglut-2.6.0/lib/libfreeglut32_static.a".
Перейти на этот сайт для дальнейшей ссылки на компиляцию freeglut с MinGW.
Прежде чем заставить работать GLTools, убедитесь, что freeglut работает.
Откройте Code :: Blocks и закройте все открытые проекты.Перейдите в «Настройки-> Компилятор и отладчик» и откройте вкладку «Каталог поиска».В компиляторе добавьте каталог "c: /libs/freeglut-2.6.0/include/".В Linker добавьте «c: /libs/freeglut-2.6.0/lib /".
Создать пустой проект.Добавьте файл test.cpp.Добавьте единственную функцию int main (){return 0;}
.
Она должна быть построена без проблем.
Добавьте #define FREEGLUT_STATIC
и #include <GL/glut.h>
.
Попробуйте скомпилировать.Это не удастся.
Щелкните правой кнопкой мыши по проекту и перейдите в «Параметры сборки».Убедитесь, что вы редактируете опции для всего проекта, а не цели Debug или Release.Перейдите на вкладку Linker и добавьте в библиотеки ссылок «freeglut32_static».
Попробуйте скомпилировать.Это снова не удастся.Компилятор выдаст «неопределенную ссылку на» ошибки, перечислив кучу функций.Скопируйте имя первого и найдите его в Google.Перейти к результату поиска Microsoft (первый или второй результат).Он опишет функцию и, что более важно, скажет вам, в какой библиотеке находится эта функция.
Библиотека будет называться "thing.lib ".Снова перейдите в Параметры сборки и добавьте «что-нибудь» в библиотеки ссылок.
Попробуйте скомпилировать снова. Это потерпит неудачу еще раз. Если вы потрудитесь проверить, вы увидите, что первая «неопределенная ссылка» изменилась. Повторите 7 и 8, пока не перестанет работать. Дополнительные библиотеки, которые вы должны будете добавить для работы freeglut: «Winmm», «Gdi32» и «Opengl32».
Скомпилируйте еще раз. test.exe должен быть создан. Yay!
Хорошо, теперь, когда у нас работает freeglut, пришло время снова его сломать. Сначала мы собираемся воссоздать библиотеку GLTools, поскольку SB5 распространяет только версию .lib.
Для загрузки SB5 должно быть 4 основных каталога; FreeGlut, Linux, Visualstudio и SRC. Зайди в срк. Скопируйте каталог GLTools и вставьте его в «c: / libs».
Создать каталог lib в GLTools. Теперь в нем должно быть три каталога: / include, / src и /lib.
Поднимите MSYS снова. Введите «cd / c / libs / GLTools / src» и нажмите [enter].
Как и в случае с freeglut, мы собираемся собрать код всех инструментов и связать его в единую библиотеку. Введите «g ++ -c * .cpp -I ../ include» и нажмите [enter], а затем «ar rcs libGLTools.a * .o».
Обрезать вывод libGLTools.a в "c: / libs / GLTools / lib".
Мы делаем то же самое для glew. Введите «g ++ -c glew.c -I ../ include», а затем [enter]. Затем "ar rcs libglew.a glew.o".
В Code :: Blocks вернитесь в «Настройки-> Компилятор и отладчик» и откройте вкладку «Поиск в каталоге». В Компилятор добавьте каталог "c: / libs / GLTools / include /". В Linker добавьте "c: / libs / GLTools / lib /".
Я обещал, что мы сломаем то, что сделали раньше, не так ли? Добавьте в нашу тестовую программу #include <GLTools.h>
и попробуйте собрать проект. Вы должны получить множество ошибок «GLAPI не называет тип». Это происходит потому, что в какой-то момент (не знаю, где я) GLAPI не определен. Или это неправильно определено.
Это стоит исследовать, если вы никогда не работали с такими библиотеками (у меня нет, поэтому для меня это тоже опыт обучения). Когда мы включаем «glut.h», если вы откроете файл заголовка, вы увидите, что он просто включает «freeglut_std.h». Итак, вы открываете этот файл, и у него есть куча команд препроцессора.
Запустите поиск GLAPI в документе, и мы обнаружим, что он не определяет его здесь. Это, однако, включает <GL/gl.h>
и <GL/glu.h>
. Так что откройте gl.h и выполните поиск там.
Бинго! Мы можем увидеть несколько команд, которые играют с нашим определением GLAPI. Это немного сбивает с толку, но мы собираемся скопировать то, что обычно делает препроцессор. Итак, у нас есть следующие строки:
/* GLAPI, part 1 (use WINGDIAPI, if defined) */
#if defined(__WIN32__) && defined(WINGDIAPI)
# define GLAPI WINGDIAPI
#endif
/* GLAPI, part 2 */
#if !defined(GLAPI)
# if defined(_MSC_VER) /* Microsoft Visual C++ */
# define GLAPI __declspec(dllimport)
# elif defined(__LCC__) && defined(__WIN32__) /* LCC-Win32 */
# define GLAPI __stdcall
# else /* Others (e.g. MinGW, Cygwin, non-win32) */
# define GLAPI extern
# endif
#endif
Мы можем выполнить поиск freeglut_std.h и выяснить, что WINGDIAPI не определен. Итак, мы пропустили первый блок. Из второго блока мы видим, что строка, которую мы хотим, это #define GLAPI extern
.
То, что, похоже, происходит, это то, что один из заголовков в GLTools испортил нам это определение. Там мало что можно сделать, но попытаться выяснить, где проблема.
GLTools ничего не говорит о GLAPI, но включает <windows.h>
и <GL/glew.h>
до <GL/gl.h>
. glew.h определяет GLAPI пару раз, но, поскольку в коде нет никаких отступов, сложно понять, вводится код или нет. Однако ясно, что для наших целей GLAPI должен быть определен как extern. Итак, мы собираемся сделать быстрый взлом в нашем test.cpp и определить GLAPI как extern прямо перед включаемой командой.
#include <GLTools.h>
#define FREEGLUT_STATIC
#define GLAPI extern
#include <GL/glut.h>
Это все еще будет сломано, но мы должны получить НОВУЮ ошибку! Итак, мы компилируем и ....
Ха. Скомпилировано без ошибок. Этого не должно было случиться. Но тогда мы не вызываем ни одну из функций в GLTools, так что, возможно, это не так странно. Мы нажмем на удачу и добавим второе включение в triangle.ccp, #include <GLShaderManager.h>
. И скомпилировать, и опять без ошибок.
Хорошо, мы почти готовы построить пример.Теперь мы начинаем заполнять test.cpp содержимым triangle.cpp и проверяем, если он не работает.Я начинаю с добавления
GLBatch triangleBatch;
GLShaderManager shaderManager;
вне main, и вот, пара неопределенных ссылок.Это больше походит на это.Поэтому мы открываем параметры сборки (не забудьте указать весь проект, а не цели выпуска или отладки) и добавляем GLTools в библиотеки ссылок.Мы делаем это, и теперь (как и следовало ожидать, если вы обращали внимание) мы получаем кучу неопределенных ссылок на функции glew.
Ви!Так волнительно.Итак, теперь мы добавляем библиотеку glew в опции Build.Если вы связали глеу в конце, мы узнаем что-то новое.Вы должны помнить, что при связывании библиотек, те, которые имеют свои собственные зависимости, должны быть связаны раньше, чем те, от которых они зависят.Было бы полезно, если бы мы знали заранее, от чего все они зависят, поэтому в будущем нарисуем карту или еще что-нибудь.
Поэтому мы хотим связать freeglut, который зависит от winmm, gdi32 и opengl32.Мы также хотим GLTools, который зависит от glew, и glew, который зависит от opengl32.Порядок их связывания должен быть следующим: freeglut, GLTools, glew, winmm, gdi32 и opengl32.Посмотрим, сработает ли это ...
Ха!Скомпилировано без ошибок.Черт, я хорош (не совсем :().
Хорошо, теперь, когда мы настроили среду, я скопировал оставшуюся часть файла Triangle.cpp, сохранил, собрал и не получил ошибок.
Я проверил эти шаги на двух компьютерах, и они сработали. Я думаю, что приведенные выше шаги должны позволить любому с Code :: Blocks и MinGW создавать учебные пособия в OpenGL SuperBible, 5-е издание.