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

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

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

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

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

Q&A

解決済

1回答

2328閲覧

SDLライブラリ SDL_ttf.hを使って画面に文字を表示させたいが「未解決の外部シンボル」というエラーが出てしまう原因と対処方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

0グッド

0クリップ

投稿2020/07/11 06:45

編集2020/07/11 10:29

提示コードのコメント部です。////////// 提示コードのコメント部の三つの関数ですが構文エラーにならないのですが何故か「未解決の外部シンボル」というエラーが出てしまい困っています。提示画像参照これはどうしたらいいのでしょうか?

イメージ説明

#include "Game.hpp" #include "stdio.h" const int thickness = 15;//厚さ const float paddleH = 100.0f;//高さ //コンストラクタ Game::Game() :mWindow(nullptr) ,mRenderer(nullptr) ,mTicksCount(0) ,mIsRunning(true) ,mPaddleDir(0) { } //初期化 //成功時:true 失敗時: false bool Game::Initialize() { //SDLの初期化 int sdlResult = SDL_Init(SDL_INIT_VIDEO); if(sdlResult != 0) { SDL_Log("Unnable to initialize SDL: %s",SDL_GetError()); return false; } //SDL ウインドを生成 mWindow = SDL_CreateWindow( "Game Programming in C++ (chapter 1)", 400, 100, 1024, 768, 0 ); //ウインドウ生成エラー if(!mWindow) { SDL_Log("failed to create window: %s",SDL_GetError()); return false; } mRenderer = SDL_CreateRenderer( mWindow, // Window to create renderer for -1, // Usually -1 SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC ); //レンダリング エラー if(!mRenderer) { SDL_Log("failed to create renderer %s",SDL_GetError()); return false; } //TTFエンジンを初期化 if(TTF_Init() == -1)//////////////////////////////////////////////////// { return false; } mfont = TTF_OpenFont("MSゴシック",24);///////////////////////////////////////// SDL_Color mTextColor; mTextColor.r = 0; mTextColor.g = 0; mTextColor.b = 0; mTextColor.a = 0; image = TTF_RenderUTF8_Blended(mfont,"あいうえお",mTextColor);///////////////////////////// //パドル座標 mPaddlePos.x = 10.0f; mPaddlePos.y = 768.0f / 2.0f; //ボール座標 mBallPos.x = 1024.0f / 2.0f; mBallPos.y = 768.0f / 2.0f; //ボールの速度 mBallVel.x = -200.0f; mBallVel.y = 235.0f; return true; } //ゲームループ void Game::RunLoop() { while(mIsRunning) { ProcessInput(); UpdateGame(); GenerateOutput(); } } //入力処理 void Game::ProcessInput() { SDL_Event event; while(SDL_PollEvent(&event)) { //イベント処理 switch(event.type) { case SDL_QUIT: mIsRunning = false; break; } } //キーボード const Uint8 *state = SDL_GetKeyboardState(NULL); if(state[SDL_SCANCODE_ESCAPE]) { mIsRunning = false; } mPaddleDir = 0; if(state[SDL_SCANCODE_W])//W { mPaddleDir -= 1; } if(state[SDL_SCANCODE_S])//S { mPaddleDir += 1; } } void Game::UpdateGame() { //フレーム //while(!SDL_TICKS_PASSED(SDL_GetTicks(),mTicksCount + 16)); float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f; if(deltaTime > 0.05f) { deltaTime = 0.05f; } mTicksCount = SDL_GetTicks(); if(mPaddleDir != 0)//パドル操作中だったら { mPaddlePos.y += mPaddleDir * 300.0f * deltaTime; if(mPaddlePos.y < (paddleH / 2.0f + thickness) ) { mPaddlePos.y = paddleH / 2.0f + thickness; }else if(mPaddlePos.y > (768.0f - paddleH / 2.0f - thickness)) { mPaddlePos.y = (768.0f - paddleH / 2.0f - thickness); } } //ボール移動 mBallPos.x += mBallVel.x * deltaTime; mBallPos.y += mBallVel.y * deltaTime; //printf("x: %.2f\n",mBallVel.x); //printf("y: %.2f\n",mBallVel.y); float diff = mPaddlePos.y - mBallPos.y; diff = (diff > 0.0f) ? diff : -diff; if(diff <= paddleH / 2.0f && mBallPos.x <= 25.0f && mBallVel.x < 0.0f) { //mBallVel.x *= -1.0f; }else if(mBallPos.x <= 0.0f && mBallVel.x < 0.0f)//left wall 跳ね返り { printf("Left Collision \n"); mBallVel.x *= -1.0f; }else if(mBallPos.x >= (1024.0f - thickness) && mBallVel.x > 0.0f)//right wall 跳ね返り { printf("Right Collision \n"); mBallVel.x *= -1.0f; } if(mBallPos.y <= thickness && mBallVel.y < 0.0f) { mBallVel.y *= -1; }else if(mBallPos.y >= (768 - thickness) && mBallVel.y > 0.0f) { mBallVel.y *= -1; } } //出力 void Game::GenerateOutput() { //色を設定 青 SDL_SetRenderDrawColor(mRenderer, 0, 0, 255, 255 ); SDL_RenderClear(mRenderer); SDL_SetRenderDrawColor(mRenderer,255,255,255,255); SDL_Rect wall { 0, 0, 1024, thickness }; SDL_RenderFillRect(mRenderer,&wall); wall.y = 768 - thickness; SDL_RenderFillRect(mRenderer,&wall); wall.x = 1024 - thickness; wall.y = 0; wall.w = thickness; wall.h = 1024; SDL_RenderFillRect(mRenderer,&wall); //paddle draw SDL_Rect paddle{ static_cast<int>(mPaddlePos.x), static_cast<int>(mPaddlePos.y - paddleH / 2), thickness, static_cast<int>(paddleH), }; SDL_RenderFillRect(mRenderer,&paddle); //ball draw SDL_Rect ball{ static_cast<int>(mBallPos.x - thickness / 2), static_cast<int>(mBallPos.y - thickness / 2), thickness, thickness, }; SDL_RenderFillRect(mRenderer,&ball); //front buffer and back buffer SDL_RenderPresent(mRenderer); } void Game::Shutdown() { SDL_DestroyRenderer(mRenderer); SDL_DestroyWindow(mWindow); SDL_Quit(); }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/07/11 08:44 編集

後から検索する人のためにもタイトルと質問文を正しいエラーメッセージに修正してください。「未定の外部参照」、「未定義の外部参照」→「未解決の外部参照」もしくは「未解決の外部シンボル」
guest

回答1

0

ベストアンサー

SDL2_tff.libをリンクしてください。
SDL_ttf 2.0

投稿2020/07/11 07:59

編集2020/07/11 08:02
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/11 08:05

提示コードにはありませんが.hppファイルにて#include <SDL_tff.h>をインクルードしています。また Development Libraries:のvisual c++ x64版をダウンロードしてvisual studio 上のの設定で追加のライブラリディレクトリと追加のインクルードディレクトリにそれぞれ追加したのですが何をしていないのでしょうか?
SHOMI

2020/07/11 08:10 編集

ディレクトリ指定だけで、追加の依存ファイルにSDL2_tff.libを追加していないのでは?
SHOMI

2020/07/11 08:15

追加の依存ファイルに指定する以外にも、ソースファイルに #pragma comment(lib, "SDL2_tff.lib") と書くことでも指定できます。
退会済みユーザー

退会済みユーザー

2020/07/11 08:17

そうですね。追加の依存ファイルにSDL2_tff.libを追加していなかったので追加したのですが今度は 実行した瞬間にダイアログが出まして。"SDL2_ttf.dllファイルがありません"と表示されるのですがこれはどうしたらいいのでしょうか?
SHOMI

2020/07/11 08:26

環境変数PATHにSDL2_ttf.dllのあるフォルダを追加するか、実行ファイルと同じ場所にSDL2_ttf.dllをコピーしてください
退会済みユーザー

退会済みユーザー

2020/07/11 08:32

プロジェクトを漁って.exeファイルの場所に.dllファイルをコピーしたら動きました。!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問