2013-06-02 60 views
-1

我正在學習OpenGL並嘗試運行我的第一個程序。我已將所有文件包含在include,lib和bin文件夾中。我試圖添加opengl32.lib; glut32.lib; glu32.lib;在配置屬性 - >連接器 - >輸入中,但它沒有工作。錯誤LNK2019:在函數「void __cdecl init(void)」(?init @@ YAXXZ)中引用的無法解析的外部符號_LoadShaders

我使用Visual Studio 2012

/////////////////////////////////////////////////////////////////////// 
// 
// triangles.cpp 
// 
/////////////////////////////////////////////////////////////////////// 

#include <iostream> 
using namespace std; 

#include <vgl.h> 
#include <LoadShaders.h> 

enum VAO_IDs { Triangles, NumVAOs }; 
enum Buffer_IDs { ArrayBuffer, NumBuffers }; 
enum Attrib_IDs { vPosition = 0 }; 

GLuint VAOs[NumVAOs]; 
GLuint Buffers[NumBuffers]; 

const GLuint NumVertices = 6; 

//--------------------------------------------------------------------- 
// 
// init 
// 

void 
init(void) 
{ 
    glGenVertexArrays(NumVAOs, VAOs); 
    glBindVertexArray(VAOs[Triangles]); 

    GLfloat vertices[NumVertices][2] = { 
     { -0.90, -0.90 }, // Triangle 1 
     { 0.85, -0.90 }, 
     { -0.90, 0.85 }, 
     { 0.90, -0.85 }, // Triangle 2 
     { 0.90, 0.90 }, 
     { -0.85, 0.90 } 
    }; 

    glGenBuffers(NumBuffers, Buffers); 
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), 
       vertices, GL_STATIC_DRAW); 

    ShaderInfo shaders[] = { 
     { GL_VERTEX_SHADER, "triangles.vert" }, 
     { GL_FRAGMENT_SHADER, "triangles.frag" }, 
     { GL_NONE, NULL } 
    }; 

    GLuint program = LoadShaders(shaders); 
    glUseProgram(program); 

    glVertexAttribPointer(vPosition, 2, GL_FLOAT, 
    GL_FALSE, 0, BUFFER_OFFSET(0)); 

    glEnableVertexAttribArray(vPosition); 
} 

//--------------------------------------------------------------------- 
// 
// display 
// 

void 
display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBindVertexArray(VAOs[Triangles]); 
    glDrawArrays(GL_TRIANGLES, 0, NumVertices); 

    glFlush(); 
} 

//--------------------------------------------------------------------- 
// 
// main 
// 

int 
main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA); 
    glutInitWindowSize(512, 512); 
    glutInitContextVersion(4, 3); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 
    glutCreateWindow(argv[0]); 

    if (glewInit()) { 
     cerr << "Unable to initialize GLEW ... exiting" << endl; 
     exit(EXIT_FAILURE); 
    } 

    init(); 

    glutDisplayFunc(display); 

    glutMainLoop(); 
} 
+0

看看http://stackoverflow.com/q/13255577/11683幫助。 – GSerg

回答

6

你錯過的lib(或CPP)文件爲LoadShaders()東西,但它僅僅是標題。不知道它的內容,我們不能肯定地說。


更新:

隨書的源代碼的壓縮文件包含你所需要的一切。

你應該做到以下幾點:

  • 把zip文件解壓到一個容易記住的位置,例如「C:\ openglbook」。
  • 打開或創建在Visual Studio 2012
  • 打開菜單 「Project」 項目,並選擇 「[項目]屬性...」(或按Alt鍵+ F7 )。
  • 對每個配置重複以下步驟或選擇左上角的「所有配置」。
  • 在左邊的樹中打開「配置屬性」並選擇「VC++目錄」。
  • c:\openglbook\include添加到「包含目錄」。
  • c:\openglbook\lib添加到「庫目錄」。
  • 關閉項目屬性。
  • 將文件「c:\ openglbook \ lib \ LoadShaders.cpp」複製到您的項目文件中,並將其添加爲另一個源文件。

一旦完成此項目,您的項目應該建立。如果您仍然缺乏依賴項(如GLUT函數),請將適當的庫從「lib」子目錄添加到您已知的鏈接程序庫列表中。

+0

這是一個圖書館和目錄是: C:\ Program Files文件(x86)的\微軟的Visual Studio 11.0 \ VC \包括 – Lucas

+0

你得把庫文件到'lib'子目錄或將其添加爲一個額外的目錄進行調查。如果你沒有這樣的文件,你有什麼文件?把它們全部列在你的問題中。 – Mario

+0

你的「LoadShaders.h」文件在哪裏?如果可能的話,你從哪裏得到它? – Mario

1

問題出在你的LoadShaders函數沒有正文(大概來自你的LoadShaders.h)。找到.cpp爲LoadShaders,或鏈接它的庫。

如果LoadShaders lib中,因爲你正在使用VS 2012,你可以使用預處理指令鏈接你的lib目錄下:

#pragma comment(lib, "yourlibfilename.lib") 

確保您的lib實際上是在那裏你說,這是。默認情況下,Visual Studio將假定該lib駐留在與源文件的默認文件夾相同的文件夾中。

+0

VS2012有什麼特別之處?你一直能夠做到這一點 –

+0

奧利?我很確定這是一個MSVC擴展。無論如何,用'#pragma'無法確定。 – bobobobo

+0

它僅適用於MSVC,但它在早期版本中可用。您的文字就像VS2012中的新內容一樣。 –

0

只添加Linker->Input中的庫是不夠的。鏈接器仍然不會找到它們,因爲你的庫位於某個任意目錄中。將他們所在的目錄添加到設置Linker->General->additional library directories

+0

我得到了同樣的錯誤。 – Lucas

相關問題