Ошибка LNK2005, уже определенная: возможно одно нарушение правила определения?

0

Я искал и нашел различные подобные вопросы, хотя я не смог найти решение для своей проблемы. Это программа SDL2 + OpenGL, я могу скомпилировать ее без проблем в Linux, используя g++ 4.9.1, хотя и не в Windows (VS 2013).

Я получаю такие ошибки, как:

Ошибка 1 ошибка LNK2005: "союз SDL_Event e" (? E @@3TSDL_Event @@A), уже определенный в 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
}

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 'msvcrt.lib' конфликтует с использованием других libs; use/NODEFAULTLIB: библиотека PATH_TO_PROJECT\MSVCRTD.lib(cinitexe.obj) Игра

Ошибка 10 ошибка LNK2019: неразрешенный внешний символ _SDL_main, на который ссылается функция _main PATH_TO_PROJECT\SDL2main.lib(SDL_windows_main.obj) Игра

Ошибка 11 ошибки LNK1120: 1 неразрешенные внешние файлы PATH_TO_PROJECT\Game.exe

Я не могу понять, что происходит, особенно потому, что я могу скомпилировать его в Linux, может кто-то мне помочь? Библиотеки исправлены связаны, проверены. Кроме того, если я помещаю весь код в основную функцию и использую только один файл, он компилируется и запускается без проблем.

  • 0
    почему вы снова включаете SDL.h и SDL_opengl в main?
  • 0
    Исправлено @AliKazmi, спасибо
Теги:
visual-studio
opengl
sdl-2

2 ответа

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 */
  • 0
    +1 но не только e . все переменные в «engine.h» определяются дважды, 1-й в «engine.cpp», когда включается «engine.h», и 2-й в «main.cpp», когда исправлено включение «engine.h», нужно сделать то, что Вы сказали всем переменным в заголовке.
  • 0
    @SHR Действительно, именно поэтому я упомянул, чтобы исправить это в первую очередь. Это фиксирует все , определяющие несколько раз, то все , что осталось , чтобы исправить это e .
Показать ещё 4 комментария
1

Вы получаете эти проблемы с переопределением, так как вы включили файл.cpp в свой основной:

#include "engine.cpp"

Вы всегда должны включать только заголовочные файлы. (Также эти заголовочные файлы должны содержать соответствующие заголовочные заголовки).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню