-3

私は現在、ビデオ ゲーム用の OpenGL フレームワークを開発しています。このフレームワークには、シェーダーをロードする特定のプログラムが含まれています。上記のプログラムのクラスには、次の3つの機能があります。

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;
}

ただし、このコードをコンパイルしようとすると、2 つの「未解決の外部シンボル」エラーが表示されます。

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)

ヘッダー ファイルでは、次の 3 つの関数を次のように定義します。

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

私がこれを正しく理解できたとしても (ほとんどの場合、そうではありません)、コンパイラーはこれらの関数がどこから来たのかを理解できません。誰か助けてくれませんか?

4

2 に答える 2

2

未解決の外部シンボルとは、コンパイラが、記述したコードを調べ、コンパイル中のソース ファイル内のすべてのコードと、リンカーが検索するために必要な一連のシンボルを生成したことを意味します。リンカーはすべてのオブジェクト コード ファイルを取得し、1 つの翻訳単位(ソース ファイルとそのヘッダーを考えてください) からすべての定義済みシンボルをすべてのシンボルにマップします。実装されたシンボルが見つからない場合、未解決の外部シンボルを発行します。

一般に、これはオブジェクト ファイルのリンカー リストにライブラリ オブジェクト ファイルを含めなかったことが原因です。関数を宣言し、定義していない場合、他の可能性が高い原因です。

未定義のシンボルを発行します

main.cpp

int foo(); 

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

foo を定義していないため、これは文句を言います。

于 2013-03-21T16:20:04.727 に答える