2013-06-09 3 views
0

Помогите с ошибкой Source1.cpp(128): error C3861: 'InitShader': identifier not found, когда у меня есть 2 файла, а один - InitShader.cpp. Оба файла скомпилированы. Я считаю, что некоторые настройки в Visual Studio позволяют одному файлу найти другое, поскольку на InitShader ссылается другой исходный файл. Проект выглядит в VS 2012Ошибка сборки в VS2012

enter image description here

код

#include "Angel.h" 

namespace Angel { 

// Create a NULL-terminated string by reading the provided file 
static char* 
readShaderSource(const char* shaderFile) 
{ 
    FILE* fp = fopen(shaderFile, "r"); 

    if (fp == NULL) { return NULL; } 

    fseek(fp, 0L, SEEK_END); 
    long size = ftell(fp); 

    fseek(fp, 0L, SEEK_SET); 
    char* buf = new char[size + 1]; 
    fread(buf, 1, size, fp); 

    buf[size] = '\0'; 
    fclose(fp); 

    return buf; 
} 


// Create a GLSL program object from vertex and fragment shader files 
GLuint 
InitShader(const char* vShaderFile, const char* fShaderFile) 
{ 
    struct Shader { 
    const char* filename; 
    GLenum  type; 
    GLchar*  source; 
    } shaders[2] = { 
    { vShaderFile, GL_VERTEX_SHADER, NULL }, 
    { fShaderFile, GL_FRAGMENT_SHADER, NULL } 
    }; 

    GLuint program = glCreateProgram(); 


    for (int i = 0; i < 2; ++i) { 
    Shader& s = shaders[i]; 
    s.source = readShaderSource(s.filename); 
    if (shaders[i].source == NULL) { 
     std::cerr << "Failed to read " << s.filename << std::endl; 
     exit(EXIT_FAILURE); 
    } 

    GLuint shader = glCreateShader(s.type); 

    glShaderSource(shader, 1, (const GLchar**) &s.source, NULL); 
    glCompileShader(shader); 

    GLint compiled; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 
    if (!compiled) { 
     std::cerr << s.filename << " failed to compile:" << std::endl; 
     GLint logSize; 
     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logSize); 
     char* logMsg = new char[logSize]; 
     glGetShaderInfoLog(shader, logSize, NULL, logMsg); 
     std::cerr << logMsg << std::endl; 
     delete [] logMsg; 

     exit(EXIT_FAILURE); 
    } 

    delete [] s.source; 

    glAttachShader(program, shader); 
    } 

    /* link and error check */ 
    glLinkProgram(program); 

    GLint linked; 
    glGetProgramiv(program, GL_LINK_STATUS, &linked); 
    if (!linked) { 
    std::cerr << "Shader program failed to link" << std::endl; 
    GLint logSize; 
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logSize); 
    char* logMsg = new char[logSize]; 
    glGetProgramInfoLog(program, logSize, NULL, logMsg); 
    std::cerr << logMsg << std::endl; 
    delete [] logMsg; 

    exit(EXIT_FAILURE); 
    } 

    /* use program object */ 
    glUseProgram(program); 

    return program; 
} 

} // Close namespace Angel block 
+3

Вы должны объявить его в заголовке и включить в оба файла. – chris

+2

Похоже, что отсутствующий заголовок включает, как уже упоминалось. Однако нам понадобится фрагмент кода, чтобы предоставить дополнительную информацию. –

+1

Звучит как циркуляр, включающий в себя ... –

ответ

1

звучит ошибка, как это исходит от Source1.cpp не будучи должным образом общаться с InitShader.cpp

С там, кажется, нет InitShader.h, я предполагаю, что вы пытаетесь #include в Source1.cpp, который, вероятно, там, где возникает ошибка, поскольку он ожидает заголовочный файл.

Я бы сказал, попробуйте перенести все свое определение функции из InitShader.cpp на файл InitShader.h и попробуйте включить его в Source1.cpp. Это мое лучшее предположение, не видя фактического кода в Source1.cpp.


Альтернативные идеи:

Похоже, что вы предоставляете тело функции в InitShader.cpp для функциональных прототипов я предполагаю в Angel.h. Вы объявляете функции в Angel.h, которые затем определяете в InitShader.cpp? Если это так, я бы очень рекомендовал создать файл Angel.cpp и определить там функции Angel. Это было бы намного чище, и у меня есть подозрение, что это может стать проблемой, с которой вы столкнулись.

+0

Вы правы, я изменил его на «InitShader.h», а затем он работает. Спасибо за ответ. –

+1

Я рад, что это сработало! Вы действительно можете подумать о создании файла Angel.cpp, хотя и перемещаете определения функции Angel там. Не строго необходимо и, возможно, не имеет смысла с остальной частью вашего кода (части, которые я не видел), но в целом с файлами .h и .cpp с таким же именем делает вещи намного яснее и более организованными. – Nathan

Смежные вопросы