【发布时间】:2013-03-11 06:16:11
【问题描述】:
我目前正在为视频游戏开发 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>&);
如果我做对了(我很可能没有做对),编译器就无法理解这些函数的来源。有谁能帮帮我吗?
【问题讨论】:
-
你是怎么编译的?
-
就像关于同一主题的所有其他问题一样:您没有链接到符号的定义。弄清楚他们住在哪里,把他们联系起来,完成。
-
这些函数与 InitShaderProgram() 函数存在于同一个类中,这不是让它们默认链接吗?
-
@Jakobson “住在课堂上”这个词太模糊,无法回答。这些函数必须由编译器编译,并且生成的目标文件必须传递给链接器。这两件事中的一件没有发生在你身上。
标签: c++ opengl external symbols