c++ - LNK2005错误,已经定义: Possibly one definition rule violation?

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

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

我收到如下错误:

Error 1 error LNK2005: "union SDL_Event e" (?e@@3TSDL_Event@@A) already defined in engine.obj PATH_TO_PROJECT\main.obj Game

对于文件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
}

ma​​in.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;
}

我也得到了这些:

Warning 9 warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library PATH_TO_PROJECT\MSVCRTD.lib(cinitexe.obj) Game

Error 10 error LNK2019: unresolved external symbol _SDL_main referenced in function _main PATH_TO_PROJECT\SDL2main.lib(SDL_windows_main.obj) Game

Error 11 error LNK1120: 1 unresolved externals PATH_TO_PROJECT\Game.exe Game

我真的不明白发生了什么,特别是因为我可以在 Linux 上编译它,有人可以帮助我吗? 库已更正链接,已验证。此外,如果我将所有代码放在主函数中并只使用一个文件,它可以毫无问题地编译和运行。

最佳答案

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

此外,您确实在每个包含 engine.h header 的翻译单元中多次定义了全局 e。在 engine.h header 中将其声明为 extern,这告诉编译器 e 存在于某处 但不存在实际定义它:

extern SDL_Event e;

然后只在一个翻译单元中定义它;将其放入 engine.cpp:

SDL_Event e;

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

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

这在 engine.cpp 中:

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

关于c++ - LNK2005错误,已经定义: Possibly one definition rule violation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26901827/

相关文章:

c++ - 为什么我的 DLL 不需要 DllMain 函数?

c# - Visual Studio Web 浏览器 CSS3 支持

c++ - std::vector 构造函数是否不为每个元素调用对象构造函数?

c++ - 获取指向非静态成员函数的函数指针

c++ - 在运行时动态创建多个框架时出错(C++,FMX,IDE:C++ Builder)

c++ - boost 文件系统错误(temp_directory_path 返回 <Bad Ptr>)

c# - 在 asp.net mvc 中,context.User.Identity.Name 的用途是什么?

c++ - Tic Tac Toe C++算法调试帮助

javascript - 在 Node.js 命令上,为什么我收到错误消息 "windows cannot find $. Make sure you' 已经正确输入了名称...”

windows - 优化 - 使用 Windows API 从磁盘读取文件