错误LNK2005。看起来文件是includet两次

时间:2015-05-28 13:04:13

标签: c++

我想用OpenGL编写一个小游戏,我有FileUtils.hpp ReadFile函数,我有一个类ShaderProgram来处理着色器并使用FileUtils

现在,当我想启动该程序时,我收到此错误:

  

ShaderProgram.obj:错误LNK2005:&#34; class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl ReadFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)&#34; (?ReadFile @@ YA?AV?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @ D @ 2 @@ std @@ ABV12 @@ Z)已在Main.obj中定义

我对C ++的经验不多,但我认为这个错误告诉我,我的ReadFile函数定义了两次。如果您包含两次没有#pragma once或标头保护的头文件,则会发生这种情况。

我的FileUtils.hpp看起来像这样:

#pragma once  

#include <string>
#include <iostream>
#include <fstream>

std::string ReadFile(const std::string& fileName)
{
    // File reading is done here.
    // Not important for this question.
}

我的ShaderProgram包含此标题:

#pragma once

#include <string>
#include <GLEW\glew.h>
#include "FileUtils.hpp"

// Shader stuff done here

我的Main.cpp包括ShaderProgram.hpp

#include "ShaderProgram.hpp"
#include "Window.hpp"

#define WIDTH 800
#define HEIGHT 600
#define TITLE "Voxelworld"

#define VERTEX_SHADER_FILE "voxelworld.v.glsl"
#define FRAGMET_SHADER_FILE "voxelworld.f.glsl"

using namespace voxelworld;

int main(int argc, char *argv[])
{
    Window window = Window(WIDTH, HEIGHT, TITLE);
    ShaderProgram shaderProgram = ShaderProgram(VERTEX_SHADER_FILE, FRAGMET_SHADER_FILE);

    while (!window.IsCloseRequested())
    {
        shaderProgram.Use();
        window.Update();
        shaderProgram.StopUse();
    }

    return 0;
}

Window.hpp既不包含FileUtils.hpp也不包含ShaderProgram.hpp

我很确定我在某个地方犯了一个愚蠢的错误,但我不知道在哪里。

2 个答案:

答案 0 :(得分:3)

除非函数小到足以希望内联(在这种情况下你应该标记它),否则不要在头文件中定义函数,只有声明

所以在头文件中也可以这样做。

std::string ReadFile(const std::string& fileName);

然后在一个源文件中执行完整定义:

std::string ReadFile(const std::string& fileName)
{
    ...
}

您现在遇到的问题是,在包含头文件的所有源文件(translation units)中,该函数将定义

答案 1 :(得分:0)

没有包装类或命名空间,ReadFile可能与WinBase.h中的ReadFile冲突。 WinBase.h经常会在你的包含树中深处。