我目前正在为视频游戏开发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>&);
如果我做对了(我很可能不这样做),编译器不会理解这些函数的来源。任何人都可以帮助我吗?
答案 0 :(得分:2)
未解析的外部符号表示编译器已查看您编写的代码,并已生成您正在编译的源文件中的所有代码以及链接器查找所需的一组符号。链接器获取所有目标代码文件,并将所有定义的符号从一个translation unit(思考源文件及其标题)映射到所有符号。当它找不到已实现的符号时,它会发出一个未解析的外部符号。
通常,这是因为您无法将库对象文件包含在目标文件的链接器列表中。另一个可能的原因是你声明了一个函数而没有定义它。
发出未定义的符号
的main.cpp
int foo();
int main(int argc, char ** argv)
{
return foo();
}
这会抱怨因为我没有定义foo。
答案 1 :(得分:1)
如果我做对了(我很可能没有),编译器不会理解这些函数的来源。
不幸的是没有。错误不是来自编译器,而是来自链接器。
您是否已经实现了这两个函数:ShaderLoader :: CreateShader和ShaderLoader :: CreateProgram?或者只是在标题中声明?你怎么联系?