2014-12-04 42 views
0

我在閱讀OpenGL編程指南:官方OpenGL學習指南。但是在運行第一個例子時遇到問題。無法在OS X上使用Xcode在OpenGL編程指南中運行示例代碼

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

using namespace std; 

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

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

const GLuint NumVertices = 6; 

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

    GLfloat vertices[NumVertices][2] = { 
     {-0.9, -0.9}, 
     {0.85, -0.9}, 
     {-0.9, 0.85}, 
     {0.9, -0.85}, 
     {0.9, 0.9}, 
     {-0.85, 0.9} 
    }; 

    glGenBuffers(NumBuffers, Buffers); 
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffers]); 
    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); 

} 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glBindVertexArray(VAOs[Triangles]); 
    glDrawArrays(GL_TRIANGLES, 0, NumVertices); 

    glFlush(); 
} 

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(); 
} 

我已經將vgl.h和LoadShaders.h所在的路徑添加到標題搜索路徑。 (我將在後的端柱,這兩個文件。)但是,錯誤顯示出來:

enter image description here

然後我改變了語句包含的頭「GL/gl.h」爲「的OpenGL/GL .H」,另一個錯誤顯示出來:

enter image description here

誰能告訴我有什麼不對?我真的很感激!

[附件]

vgl.h:

#ifndef __VGL_H__ 
#define __VGL_H__ 

// #define USE_GL3W 

#ifdef USE_GL3W 

#include <GL3/gl3.h> 
#include <GL3/gl3w.h> 

#else 

#define GLEW_STATIC 

#include <GL/glew.h> 

#ifdef _MSC_VER 
# ifdef _DEBUG 
# if (_MSC_VER >= 1600) 
#  pragma comment (lib, "glew_static_vs2010_d.lib") 
# else 
#  pragma comment (lib, "glew_static_d.lib") 
# endif 
# else 
# if (_MSC_VER >= 1600) 
#  pragma comment (lib, "glew_static_vs2010.lib") 
# else 
#  pragma comment (lib, "glew_static.lib") 
# endif 
# endif 
#endif 

#endif 

#define FREEGLUT_STATIC 

#include <GL/freeglut.h> 

#ifdef _MSC_VER 
# ifdef _DEBUG 
# if (_MSC_VER >= 1600) 
#  pragma comment (lib, "freeglut_static_vs2010_d.lib") 
# else 
#  pragma comment (lib, "freeglut_static_d.lib") 
# endif 
# else 
# if (_MSC_VER >= 1600) 
#  pragma comment (lib, "freeglut_static_vs2010.lib") 
# else 
#  pragma comment (lib, "freeglut_static.lib") 
# endif 
# endif 
#endif 

#define BUFFER_OFFSET(x) ((const void*) (x)) 

#endif /* __VGL_H__ */ 

LoadeShaders.h:

////////////////////////////////////////////////////////////////////////////// 
// 
// --- LoadShaders.h --- 
// 
////////////////////////////////////////////////////////////////////////////// 

#ifndef __LOAD_SHADERS_H__ 
#define __LOAD_SHADERS_H__ 

#include <OpenGL/gl.h> 

#ifdef __cplusplus 
extern "C" { 
#endif // __cplusplus 

//---------------------------------------------------------------------------- 
// 
// LoadShaders() takes an array of ShaderFile structures, each of which 
// contains the type of the shader, and a pointer a C-style character 
// string (i.e., a NULL-terminated array of characters) containing the 
// entire shader source. 
// 
// The array of structures is terminated by a final Shader with the 
// "type" field set to GL_NONE. 
// 
// LoadShaders() returns the shader program value (as returned by 
// glCreateProgram()) on success, or zero on failure. 
// 

typedef struct { 
    GLenum  type; 
    const char* filename; 
    GLuint  shader; 
} ShaderInfo; 

GLuint LoadShaders(ShaderInfo*); 

//---------------------------------------------------------------------------- 

#ifdef __cplusplus 
}; 
#endif // __cplusplus 

#endif // __LOAD_SHADERS_H__ 

回答

1

當我編譯這個例子中,我面對具有相同的問題,因爲你的,我認爲你不瞭解構建過程。

構建過程分爲三個步驟:

  1. 預處理 –這需要照顧,包括/進口頭文件到您的源代碼,基本上粘貼在指定文件的內容直接進入建築你的源代碼。此步驟還會將#defined值的所有實例替換爲您定義的值。
  2. 編譯器 –這會遍歷所有.m文件併爲每個文件構建一個擴展名爲.o的目標文件。每個不是來自同一個.m文件的項目都被標記爲外部符號。
  3. 鏈接器 –這將所有的目標文件合併成一個大的二進制文件,同時將符號鏈接到實際的實現。

頭文件實際上並不包含可執行代碼,而是告訴編譯器它應該接受哪些名稱和函數。這是鏈接器,然後解決這些參考。簡而言之:如果你想使用在當前.m文件之外實現的東西,那麼你需要適當的導入。

有兩種進口:

  • 用尖括號–這些都是爲了系統或「全球」包括。
  • 「路徑/標題。h 」用雙引號–這些是用於在您的當前項目範圍受限的項目

您需要編譯您的主程序需要靜態庫的文件,這些文件可以在目錄「lib」中找到,在您的庫建立成功,你應該鏈接你的項目與這個庫

此外,main()中有兩個函數是freeglut中的函數,你需要在你的mac上安裝freeglut,否則鏈接錯誤仍然會出現

你可以瀏覽文章http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/,it說明如何處理Xcode上的外部庫