-3

我目前正在为视频游戏开发 OpenGL 框架。该框架包含一个加载着色器的特定程序。在所述程序的类中,我具有以下三个功能:

InitShaderProgram(...);
CreateShader(...);
CreateProgram(...);

InitShaderProgram 以这种方式调用 CreateShader 和 CreateProgram:

bool ShaderLoader::InitShaderProgram(GLuint &Program)
{
    std::vector<GLuint> ShaderList;

    ShaderList.push_back(ShaderLoader::CreateShader(GL_VERTEX_SHADER, VertexShader));
    ShaderList.push_back(ShaderLoader::CreateShader(GL_FRAGMENT_SHADER, FragmentShader));

    Program = ShaderLoader::CreateProgram(ShaderList);
    std::for_each(ShaderList.begin(), ShaderList.end(), glDeleteShader);

    return GL_TRUE;
}

但是,每当我尝试编译此代码时,它都会给我两个“未解析的外部符号”错误:

Error   4   error LNK2019: unresolved external symbol "public: virtual unsigned int __thiscall ShaderLoader::CreateProgram(class std::vector<unsigned int,class std::allocator<unsigned int> > const &)" (?CreateProgram@ShaderLoader@@UAEIABV?$vector@IV?$allocator@I@std@@@std@@@Z) referenced in function "public: bool __thiscall ShaderLoader::InitShaderProgram(unsigned int &)" (?InitShaderProgram@ShaderLoader@@QAE_NAAI@Z)

Error   3   error LNK2019: unresolved external symbol "public: virtual unsigned int __thiscall ShaderLoader::CreateShader(unsigned int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?CreateShader@ShaderLoader@@UAEIIABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: bool __thiscall ShaderLoader::InitShaderProgram(unsigned int &)" (?InitShaderProgram@ShaderLoader@@QAE_NAAI@Z)

在我的头文件中,我这样定义这三个函数:

bool   InitShaderProgram(GLuint&);
GLuint CreateShader(GLenum, const std::string&);
GLuint CreateProgram(const std::vector<GLuint>&);

如果我做对了(我很可能没有做对),编译器就不会理解这些函数的来源。有谁可以帮我离开这里吗?

4

2 回答 2

2

未解析的外部符号意味着编译器已经查看了您编写的代码,并在您正在编译的源文件中生成了所有代码以及链接器查找所需的一组符号。链接器获取所有目标代码文件并将所有已定义符号从一个翻译单元(想想源文件及其头文件)映射到所有符号。当它找不到已实现的符号时,它会发出未解析的外部符号。

通常这是因为您未能将库目标文件包含在目标文件的链接器列表中。如果您声明了一个函数但未定义它,则可能是另一个原因。

发出未定义的符号

主文件

int foo(); 

int main(int argc, char ** argv)
{
   return foo();
}

这会抱怨,因为我没有定义 foo.

于 2013-03-21T16:20:04.727 回答
1

如果我做对了(我很可能没有做对),编译器就不会理解这些函数的来源。

不幸的是没有。错误不是来自编译器,而是来自链接器。

您是否已经实现了这两个函数:ShaderLoader::CreateShader 和 ShaderLoader::CreateProgram?或者只是在标题中声明?你怎么链接?

于 2013-03-21T16:12:52.063 回答