Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

OpenGL - Błąd narzędzi konsolidatora LNK2019

Ostatnio zmodyfikowano 2021-02-27 20:56
Autor Wiadomość
superetoille
Temat założony przez niniejszego użytkownika
OpenGL - Błąd narzędzi konsolidatora LNK2019
» 2021-02-27 19:48:19
Witam,

I znów się motam przy konfigurowaniu Visual Studio 2019, tym razem przy obsłudze biblioteki OpenGL. Przerabiam książkę Janusza Ganczarskiego "OpenGL Podstawy programowania grafiki 3D". Wszystko robiłam dokładnie jak jest opisane w książce. Dołączyłam headery, i biblioteki pobrane z ftp Heliona dołączonego do książki. Książka nie jest najnowsza bo z 2015 ale też nie wiekowa.
Proszę ewentualnie o pomoc skąd pobrać i jak zainstalować biblioteki żeby to wszystko działało.
Przy kompilowaniu programu dołączonego do książki występują błędy poniżej:

Błąd LNK2019 nierozpoznany symbol zewnętrzny "unsigned int __cdecl LoadShader(unsigned int,char const *)" (?LoadShader@@YAIIPBD@Z) przywołany w funkcji "void __cdecl InitScene(void)" (?InitScene@@YAXXZ) OpenGL2 C:\Users\zuza\source\repos\OpenGL2\OpenGL2\kwadrat.obj 1
Błąd LNK1120 liczba nierozpoznanych elementów zewnętrznych: 3 OpenGL2 C:\Users\zuza\source\repos\OpenGL2\Debug\OpenGL2.exe 1
Błąd LNK2019 nierozpoznany symbol zewnętrzny "void __cdecl LinkValidateProgram(unsigned int)" (?LinkValidateProgram@@YAXI@Z) przywołany w funkcji "void __cdecl InitScene(void)" (?InitScene@@YAXXZ) OpenGL2 C:\Users\zuza\source\repos\OpenGL2\OpenGL2\kwadrat.obj 1
Błąd LNK2019 nierozpoznany symbol zewnętrzny _main przywołany w funkcji "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) OpenGL2 C:\Users\zuza\source\repos\OpenGL2\OpenGL2\MSVCRTD.lib(exe_main.obj) 1

Kod programu poniżej:
C/C++
//////////////////////////////////////////////////////////////////////
// (c) Janusz Ganczarski
// http://www.januszg.hg.pl
// JanuszG@enter.net.pl
//////////////////////////////////////////////////////////////////////

#include <cstdlib>
#include "shaders.h"

//////////////////////////////////////////////////////////////////////
// identyfikator obiektu programu
//////////////////////////////////////////////////////////////////////
GLuint program;

//////////////////////////////////////////////////////////////////////
// identyfikator obiektu bufora z danymi tablicy
// wierzchołków - współrzędnymi wierzchołków kwadratu
//////////////////////////////////////////////////////////////////////
GLuint vertexBuffer;

//////////////////////////////////////////////////////////////////////
// identyfikator obiektu tablic wierzchołków
//////////////////////////////////////////////////////////////////////
GLuint vertexArray;

//////////////////////////////////////////////////////////////////////
// współrzędne wierzchołków trójkątów składających się na kwadrat
//////////////////////////////////////////////////////////////////////
GLfloat position[ 2 * 3 * 2 ] =
{
   
- 0.5f, - 0.5f,
   
0.5f, - 0.5f,
   
0.5f, 0.5f,
   
   
- 0.5f, - 0.5f,
   
0.5f, 0.5f,
   
- 0.5f, 0.5f
};

//////////////////////////////////////////////////////////////////////
// funkcja generująca scenę 3D
//////////////////////////////////////////////////////////////////////
void DisplayScene()
{
   
// czyszczenie bufora koloru
   
glClear( GL_COLOR_BUFFER_BIT );
   
   
// włączenie obiektu tablic wierzchołków
   
glBindVertexArray( vertexArray );
   
   
// włączenie programu
   
glUseProgram( program );
   
   
// narysowanie danych zawartych w tablicach wierzchołków
   
glDrawArrays( GL_TRIANGLES, 0, 2 * 3 );
   
   
// wyłączenie shadera
   
glUseProgram( 0 );
   
   
// wyłączenie obiektu tablic wierzchołków
   
glBindVertexArray( 0 );
}

//////////////////////////////////////////////////////////////////////
// zmiana wielkości okna
//////////////////////////////////////////////////////////////////////
void Reshape( int width, int height )
{
   
// obszar renderingu - całe okno
   
glViewport( 0, 0, width, height );
}

//////////////////////////////////////////////////////////////////////
// inicjalizacja stałych elementów maszyny stanu OpenGL
//////////////////////////////////////////////////////////////////////
void InitScene()
{
   
// kolor tła - zawartość bufora koloru
   
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
   
   
// wczytanie shaderów
   
program = glCreateProgram();
   
glAttachShader( program, LoadShader( GL_VERTEX_SHADER, "kwadrat_vs.glsl" ) );
   
glAttachShader( program, LoadShader( GL_FRAGMENT_SHADER, "kwadrat_fs.glsl" ) );
   
   
// konsolidacja i walidacja programu
   
LinkValidateProgram( program );
   
   
// generowanie identyfikatora obiektu tablic wierzchołków
   
glGenVertexArrays( 1, & vertexArray );
   
   
// utworzenie obiektu tablic wierzchołków
   
glBindVertexArray( vertexArray );
   
   
// generowanie identyfikatora obiektu bufora
   
glGenBuffers( 1, & vertexBuffer );
   
   
// utworzenie obiektu bufora wierzchołków (VBO)
   
glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer );
   
   
// załadowanie danych obiektu bufora wierzchołków
   
glBufferData( GL_ARRAY_BUFFER, sizeof( position ), position, GL_STATIC_DRAW );
   
   
// pobranie indeksu atrybutu wierzchołka o nazwie "inPosition"
   
GLuint positionLoc = glGetAttribLocation( program, "inPosition" );
   
   
// zdefiniowanie tablicy wierzchołków
   
glVertexAttribPointer( positionLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL );
   
   
// włączenie tablic wierzchołków
   
glEnableVertexAttribArray( positionLoc );
   
   
// wyłączenie obiektu tablic wierzchołków
   
glBindVertexArray( 0 );
}

//////////////////////////////////////////////////////////////////////
// usunięcie obiektów OpenGL
//////////////////////////////////////////////////////////////////////
void DeleteScene()
{
   
// usunięcie obiektu programu
   
glDeleteProgram( program );
   
   
// usunięcie obiektu bufora wierzchołków
   
glDeleteBuffers( 1, & vertexBuffer );
   
   
// usunięcie obiektu tablic wierzchołków
   
glDeleteVertexArrays( 1, & vertexArray );
}

Proszę także o podpowiedź czy można programować grafikę bez używania do tego specjalnych bibliotek graficznych jak OpenGL czy SDL używając tylko tych standardowo dołączonych?
I jak ewentualnie to robić?
Dziękuję za pomoc i pozdrawiam
P-178184
DejaVu
» 2021-02-27 20:56:23
Nie da się. Proponuję zmienić Ci treść błędów na angielski i zacząć szukać angielskich błędów linkowania. Generalnie chodzi o to, że nie dołączyłeś biblioteki OpenGL do projektu (dołączyłeś tylko pliki nagłówkowe).

https://cpp0x.pl/kursy/Kurs-SFML-2-x-C++/Instalacja-i-konfiguracja/Test-dzialania-biblioteki-SFML-2-0/462

Przeczytaj sobie ten dokument. Nie ważne, że używasz innej biblioteki - chodzi o to, abyś zobaczył gdzie się konfiguruje biblioteki dołączane przez linkera w zależności od posiadanego środowiska.
P-178185
« 1 »
  Strona 1 z 1