To jest błąd linkera, nie kodu. Nagłówki freeglut zostały znalezione, ale linker nie dostał właściwej biblioteki.
Prefiks __imp_ oznacza, że program oczekuje wersji DLL, czyli biblioteki importowej libfreeglut.a.
W Code::Blocks wejdź w:
Project → Build options → Linker settings
Dodaj biblioteki w tej kolejności:
freeglut
opengl32
glu32
winmm
gdi32
Możesz też wpisać w Other linker options:
-lfreeglut -lopengl32 -lglu32 -lwinmm -lgdi32
Następnie w:
Search directories → Linker
dodaj katalog, w którym znajduje się:
libfreeglut.a
Na przykład:
C:\freeglut\lib\x64
WażneMasz kompilator 64-bitowy:
x86_64-w64-mingw32
więc freeglut też musi być w wersji 64-bitowej dla MinGW. Biblioteka freeglut.lib przeznaczona dla Visual Studio nie będzie odpowiednia. Pakiet powinien zawierać przynajmniej:
include\GL\freeglut.h
lib\libfreeglut.a
bin\freeglut.dll
Plik:
freeglut.dll
skopiuj później obok wygenerowanego pliku .exe.
Nie mieszaj wersji statycznej i dynamicznej
Jeżeli obecnie linkujesz:
libfreeglut_static.a
to dokładnie to może powodować pokazane błędy. Twój kod oczekuje dynamicznego __imp_glut..., a biblioteka statyczna udostępnia inne symbole.
Masz wtedy dwie możliwości.
Dynamiczna — najprostsza
libfreeglut.a
freeglut.dll obok exe
Bez definiowania
FREEGLUT_STATIC
.
Statyczna
Przed includem:
#define FREEGLUT_STATIC
#include <GL/freeglut.h>
i linkowanie:
-lfreeglut_static -lopengl32 -lglu32 -lwinmm -lgdi32
Po zmianie ustawień wykonaj:
Build → Clean
Build → Rebuild
Najbardziej prawdopodobne jest, że dodałeś libfreeglut_static.a, ale nie zdefiniowałeś FREEGLUT_STATIC, albo dodałeś bibliotekę 32-bitową/MSVC zamiast 64-bitowego libfreeglut.a dla MinGW.