C++: произошло несколько определений [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++: произошло несколько определений [дубликат]

Сообщение Anonymous »

Прежде всего, извините за мой плохой английский.
Поэтому, когда я пытаюсь запустить свой проект, я получаю эту ошибку.

Код: Выделить всё

> "C:\Program Files\JetBrains\CLion 2022.2\bin\cmake\win\bin\cmake.exe" --build C:\Users\Dominus\CLionProjects\porject2121\cmake-build-debug --target porject2121 -j 9
[1/4] Building CXX object CMakeFiles/porject2121.dir/Game/Player/Textures.cpp.obj
[2/4] Building CXX object CMakeFiles/porject2121.dir/main.cpp.obj
[3/4] Building CXX object CMakeFiles/porject2121.dir/Game/Game.cpp.obj
[4/4] Linking CXX executable porject2121.exe
FAILED: porject2121.exe
cmd.exe /C "cd . && C:\PROGRA~1\JETBRA~1\CLION2~1.2\bin\mingw\bin\G__~1.EXE -g -static -static-libgcc CMakeFiles/porject2121.dir/main.cpp.obj CMakeFiles/porject2121.dir/Game/Game.cpp.obj CMakeFiles/porject2121.dir/Game/Engine/PlayerController.cpp.obj CMakeFiles/porject2121.dir/Game/Engine/Character.cpp.obj CMakeFiles/porject2121.dir/Game/Player/Player.cpp.obj CMakeFiles/porject2121.dir/Game/Player/Textures.cpp.obj -o porject2121.exe -Wl,--out-implib,libporject2121.dll.a -Wl,--major-image-version,0,--minor-image-version,0  ../SFML/lib/libsfml-graphics-s-d.a  ../SFML/lib/libsfml-window-s-d.a  ../SFML/lib/libsfml-system-s-d.a  -lOpenGL32  -lwinmm  -lgdi32  ../SFML/lib/libfreetype.a  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
C:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: CMakeFiles/porject2121.dir/Game/Game.cpp.obj: in function `std::__cxx11::basic_string::_M_is_local() const':
C:/PROGRA~1/JETBRA~1/CLION2~1.2/bin/mingw/lib/gcc/x86_64-w64-mingw32/11.2.0/include/c++/bits/basic_string.h:230: multiple definition of `Textures::player_texture'; CMakeFiles/porject2121.dir/main.cpp.obj:main.cpp:(.bss+0x0): first defined here
C:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: CMakeFiles/porject2121.dir/Game/Player/Textures.cpp.obj:Textures.cpp:(.bss+0x0): multiple definition of `Textures::player_texture'; CMakeFiles/porject2121.dir/main.cpp.obj:main.cpp:(.bss+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
и я не понимаю, откуда я взял эти многочисленные определения и почему. Файлы моего проекта, в которых упоминаются текстуры, выглядят следующим образом:
main.cpp:

Код: Выделить всё

#include "Game.h"

int main()
{
Game game;
Textures::setTextures();
Player* player = new Player(Textures::player_texture, sf::Vector2f(PLAYER_START_X,PLAYER_START_Y),PLAYER_START_HP);
sf::Clock clock;

while(game.Runing()){
float time = clock.getElapsedTime().asMicroseconds();
clock.restart();
time/=300;
game.Update();
player->Update(time);
game.Render(player);
}
delete player;
return 0;
}
Game.h:

Код: Выделить всё

#ifndef PORJECT2121_GAME_H
#define PORJECT2121_GAME_H
#include "Engine/Constants.h"
#include "Player/Player.h"
#include "Player/Textures.h"

class Game {
private:
sf::RenderWindow* m_window;
sf::VideoMode m_videomode;
sf::Event m_ev;
void initVariables();
void initWindow();
public:
Game();
~Game();
const bool Runing() const;
void pollEvents();
void Update();
void Render(Player* player);

};

#endif //PORJECT2121_GAME_H
Textures.h:

Код: Выделить всё

#ifndef PORJECT2121_TEXTURES_H
#define PORJECT2121_TEXTURES_H
#include

namespace Textures{
sf::Texture player_texture;

static void setTextures();
}

#endif //PORJECT2121_TEXTURES_H
Player.h:

Код: Выделить всё

#ifndef PORJECT2121_PLAYER_H
#define PORJECT2121_PLAYER_H
#include "Engine/Character.h"

class PlayerController;

enum class State{
IDLE,
RUN
};

class Player: public Character {
private:
State m_state;
PlayerController* m_controller;
public:
Player()=delete;
Player(sf::Texture& texture, sf::Vector2f start_pos, float health);
~Player();

void Update(float time)override;
void setState(State state);
};
Player.cpp:

Код: Выделить всё

#include "Player.h"
#include "Engine/PlayerController.h"

Player::Player(sf::Texture &texture, sf::Vector2f start_pos, float health) {
m_health=health;
m_pos=start_pos;

m_controller = PlayerController::getPlayerController();

m_sprite.setTexture(texture);
m_size=sf::Vector2f(m_sprite.getTextureRect().width,m_sprite.getTextureRect().height);
}
Player::~Player() {}

void Player::Update(float time) {
m_state=State::IDLE;
m_controller->controllPlayer(this,time);

if (m_state == State::RUN) {

}
else {

}

m_sprite.setPosition(m_pos);
}
void Player::setState(State state) {
m_state = state;
}
и мои CmakeLists выглядят так:

Код: Выделить всё

cmake_minimum_required(VERSION 3.23)
set(project "porject2121")
project(${project})
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc")
set(SFML_STATIC_LIBRARIES TRUE)

add_executable(${project}
main.cpp
Game/Game.cpp
Game/Engine/PlayerController.cpp
Game/Engine/Character.cpp
Game/Player/Player.cpp
Game/Player/Textures.cpp

Game/Game.h
Game/Engine/PlayerController.h
Game/Engine/Constants.h
Game/Engine/Character.h
Game/Player/Player.h
Game/Player/Textures.h
)
target_include_directories(${project} PRIVATE Game)
set(SFML_DIR "C:\\Users\\Dominus\\CLionProjects\\porject2121\\SFML\\lib\\cmake\\SFML")
target_link_libraries(${project} sfml-graphics sfml-window)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules")
find_package(SFML 2.5 REQUIRED graphics network audio window system)
Я пытался использовать extern для sf::Texture player_texture, это исправило несколько определений, но вызвало это

Код: Выделить всё

cmd.exe /C "cd .  && C:\PROGRA~1\JETBRA~1\CLION2~1.2\bin\mingw\bin\G__~1.EXE -g -static -static-libgcc CMakeFiles/porject2121.dir/main.cpp.obj CMakeFiles/porject2121.dir/Game/Game.cpp.obj CMakeFiles/porject2121.dir/Game/Engine/PlayerController.cpp.obj CMakeFiles/porject2121.dir/Game/Engine/Character.cpp.obj CMakeFiles/porject2121.dir/Game/Player/Player.cpp.obj CMakeFiles/porject2121.dir/Game/Player/Textures.cpp.obj -o porject2121.exe -Wl,--out-implib,libporject2121.dll.a -Wl,--major-image-version,0,--minor-image-version,0  ../SFML/lib/libsfml-graphics-s-d.a  ../SFML/lib/libsfml-window-s-d.a  ../SFML/lib/libsfml-system-s-d.a  -lOpenGL32  -lwinmm  -lgdi32  ../SFML/lib/libfreetype.a  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
C:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: CMakeFiles/porject2121.dir/main.cpp.obj:C:/Users/Dominus/CLionProjects/porject2121/main.cpp:6: undefined reference to `Textures::setTextures()'
C:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: CMakeFiles/porject2121.dir/main.cpp.obj:main.cpp:(.rdata$.refptr._ZN8Textures14player_textureE[.refptr._ZN8Textures14player_textureE]+0x0): undefined reference to `Textures::player_texture'
collect2.exe: error: ld returned 1 exit status.

Надеюсь, кто-нибудь из вас сможет мне помочь

Подробнее здесь: https://stackoverflow.com/questions/785 ... ns-occured
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»