【问题标题】:Another "unresolved exernal symbol" error [duplicate]另一个“未解析的外部符号”错误[重复]
【发布时间】: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


【解决方案1】:

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

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

发出一个未定义的符号

main.cpp

int foo(); 

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

这会报错,因为我没有定义 foo。

【讨论】:

    【解决方案2】:

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

    很遗憾没有。错误不是来自编译器,而是来自链接器。

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

    【讨论】:

    • 这不是答案...
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2010-11-12
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多