LNK2005错误,已定义:可能是一个定义规则违规?

时间:2014-11-13 05:19:25

标签: c++ windows visual-studio opengl sdl-2

我搜索并发现了各种类似的问题,虽然我无法找到解决问题的方法。 它是一个SDL2 + OpenGL程序,我可以使用g ++ 4.9.1在Linux中编译它而不会出现问题,但不是在Windows上(VS 2013)。

我收到的错误如下:

  

错误1错误LNK2005:" union SDL_Event e" (?e @@ 3TSDL_Event @@ A)已在engine.obj中定义PATH_TO_PROJECT \ main.obj游戏

对于 engine.h 文件中定义的所有变量:

//engine.h
#ifndef ENGINE_H
#define ENGINE_H

#include <SDL.h>
#include <SDL_opengl.h>
#include <iostream>
#include "player.cpp"

SDL_Event e;
bool running = true;
bool up = false, down = false, left = false, right = false;
bool attack = false;

player hero(20, 300, 50, 50, 10.0);  //x, y, lenght, height, speed

void init(char* title, int WIDTH, int HEIGHT);
void draw(SDL_Window* screen, SDL_GLContext context, int WIDTH, int HEIGHT);

#endif

engine.cpp 包含:

//engine.cpp
#include "engine.h"

void init(int WIDTH, int HEIGHT) {
    //BODY OF THE FUNCTION
}

void draw(SDL_Window* screen, SDL_GLContext context, int WIDTH, int HEIGHT) {
    //BODY OF THE FUNCTION
}

main.cpp 是唯一包含 engine.cpp 的文件:

//main.cpp
#include <SDL.h>
#include <SDL_opengl.h>
#include "engine.cpp"
#include <iostream>

#define WIDTH 800
#define HEIGHT 600

int main() {
    SDL_Init(SDL_INIT_EVERYTHING);
    STD::cout << "SDL started." << STD::endl;

    init(WIDTH, HEIGHT);

    //Create the window
    SDL_Window *screen = SDL_CreateWindow("game title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_OPENGL);
    SDL_GLContext context = SDL_GL_CreateContext(screen);

    draw(screen, context, WIDTH, HEIGHT);

    SDL_Quit();
    return 0;
}

我也得到了这些:

  

警告9警告LNK4098:defaultlib&#39; msvcrt.lib&#39;与使用其他图书馆的冲突; use / NODEFAULTLIB:library PATH_TO_PROJECT \ MSVCRTD.lib(cinitexe.obj)Game

     

错误10错误LNK2019:函数_main PATH_TO_PROJECT \ SDL2main.lib(SDL_windows_main.obj)游戏中引用了未解析的外部符号_SDL_main

     

错误11错误LNK1120:1个未解析的外部PATH_TO_PROJECT \ Game.exe游戏

我无法理解发生了什么,特别是因为我可以在Linux上编译它,有人可以帮助我吗? 图书馆经过纠正链接,经过验证。此外,如果我将所有代码放在main函数中并且只使用一个文件,它就会编译并运行没有问题。

2 个答案:

答案 0 :(得分:3)

您的main.cpp文件应包含engine.h,而不是engine.cpp

此外,您确实在包含e标头的每个翻译单元中多次定义全局engine.h。在engine.h标头中声明它extern,它告诉编译器e存在某处但实际上没有定义它:

extern SDL_Event e;

然后只在一个翻译单元中定义它;把它放在engine.cpp

SDL_Event e;

您还需要对所有其他全局变量执行相同的操作。请注意,您需要在定义它们的地方对它们进行初始化,因此这将在标题中进行:

extern bool running, attack, up, down, left, right;

这是engine.cpp

bool running = true;
bool attack = false; /* and so on */

答案 1 :(得分:1)

您正在获得这些重新定义问题,因为您已在主要文件中包含.cpp文件: -

#include "engine.cpp"

您应该始终只包含头文件。 (这些头文件也应该包含适当的标题gaurds)。