我想用OpenGL编写一个小游戏,我有FileUtils.hpp
ReadFile
函数,我有一个类ShaderProgram
来处理着色器并使用FileUtils
现在,当我想启动该程序时,我收到此错误:
ShaderProgram.obj:错误LNK2005:"
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
。
我很确定我在某个地方犯了一个愚蠢的错误,但我不知道在哪里。
答案 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经常会在你的包含树中深处。