質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

LNKエラー (2005)(1169)

TETNZ
TETNZ

総合スコア1

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2回答

0評価

0クリップ

237閲覧

投稿2022/05/29 23:16

初めまして。現在C++を動画を見ながら練習しています。
現在SFMLライブラリーを使った簡単なゲームのプログラムを組んでいますが(VS2022 )、リンクエラーがでて困っています。
例として(gameWorld.h),(gameWorld.cpp)(main.cpp)三つのコードおよびエラーコードを表示しています。他のファイル例えば(enemy.cpp,enemy.h)などの他のファイルでも同様の症状があります。

当方の認識では外部ファイルへのリンクは#include "ファイル名"を行う事で可能と認識しています。その認識に沿った形で参考にしている動画内でmain.cppではgameWorld.cppを、そしてgameWorld.cppではgameWorld.hをインクルードしています。
ただし下記のコードをVS2022でコンパイルするとエラーがでます。
色々試しているうちにmain.cppないのインクルードをgameWorld.cppではなくてgameWorld.hにするとコンパイルがエラーなしで成功することにきづきました。

そこで質問なのですが、main.cppのインクルードをCPPからHに変更することでエラーがなくなるのは正しい挙動なのでしょうか?(私の認識ではこの変化でgameWorld.cppへのリンクが切れているよう気がするのですが。。。)
初歩的な質問かもしれませんが、どうぞご教授ください。
よろしくお願いします

gameworld.h

#include <SFML/Graphics.hpp> #include <SFML/Audio.hpp> #include <iostream> #include <string> using namespace std; #ifndef GAMEWORLD_H #define GAMEWORLD_H class GameWorld { private: bool isGameOver; int damage; sf::Texture backgroundTexture; sf::Sprite background; sf::Time time; bool loadBackground(); public: bool performSetup(); bool runGame(); GameWorld(); }; #endif

gameWorld.cpp

#include "gameWorld.h" GameWorld::GameWorld() { damage = 10; }; bool GameWorld::loadBackground() { if (!backgroundTexture.loadFromFile("assets/background.png")) { std::cout << "Could not load background image" << std::endl; return false; } background.setTexture(backgroundTexture); background.scale(sf::Vector2f(1.6, 2.25)); return true; }; bool GameWorld::performSetup() { isGameOver = false; return loadBackground(); }; bool GameWorld::runGame() { sf::RenderWindow window(sf::VideoMode(1000, 1000), "Point and Click Game"); sf::Clock clock; while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) { window.close(); return false; } } window.clear(); window.draw(background); window.display(); } return false; };

main.cpp

#include "gameWorld.cpp" int main() { GameWorld world = GameWorld(); while (true) { GameWorld world = GameWorld(); if (!world.performSetup()) { return 1; } if (!world.runGame()) { return 0; } } return 0; };
Severity Code Description Project File Line Suppression State Warning C26495 Variable 'GameWorld::isGameOver' is uninitialized. Always initialize a member variable (type.6). SFML_New (ファイルパス)-with Audio\game.cpp 4 Warning C4305 'argument': truncation from 'double' to 'T' SFML_New (ファイルパス) -with Audio\game.cpp 14 Warning C4305 'argument': truncation from 'double' to 'T' SFML_New (ファイルパス) -with Audio\game.cpp 14 ーーーーーーー問題のエラーー----------- Error LNK1169 one or more multiply defined symbols found SFML_New (ファイルパス) -with Audio\Debug\SFML_New.exe 1 Error LNK2005 "public: __thiscall GameWorld::GameWorld(void)" (??0GameWorld@@QAE@XZ) already defined in game.obj SFML_New (ファイルへのパス)\SFML Working\SFML_New -with Audio\source.obj 1 Error LNK2005 "public: bool __thiscall GameWorld::runGame(void)" (?runGame@GameWorld@@QAE_NXZ) already defined in game.obj SFML_New (ファイルパス)-with Audio\source.obj 1 Error LNK2005 "public: bool __thiscall GameWorld::performSetup(void)" (?performSetup@GameWorld@@QAE_NXZ) already defined in game.obj SFML_New (ファイルパス) -with Audio\source.obj 1 Error LNK2005 "private: bool __thiscall GameWorld::loadBackground(void)" (?loadBackground@GameWorld@@AAE_NXZ) already defined in game.obj SFML_New (ファイルパス) -with Audio\source.obj 1

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。