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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

2回答

804閲覧

未解決の外部参照シンボルが解消できない

ranaka

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2024/02/24 09:20

編集2024/02/24 16:11

実現したいこと

エラーを解決してコントローラを使えるようにしたいです。

発生している問題・分からないこと

XInputが読み込めていないのかXInputGetState、XInputSetState、XInputEnableが使えません。

エラーメッセージ

error

1エラー LNK2019 未解決の外部シンボル XInputGetState が関数 "void __cdecl UpdatePad(void)" (?UpdatePad@@YAXXZ) で参照されました 2エラー LNK2019 未解決の外部シンボル XInputSetState が関数 "void __cdecl UninitPad(void)" (?UninitPad@@YAXXZ) で参照されました 3エラー LNK2019 未解決の外部シンボル XInputEnable が関数 "long __cdecl InitializePad(void)" (?InitializePad@@YAJXZ) で参照されました 4

該当のソースコード

inputx.cpp

1#include "main.h" 2#include "inputx.h" 3 4HRESULT InitializePad(void); // パッド初期化 5void UpdatePad(void); 6void UninitPad(void); 7 8HRESULT InitializePad(void) // パッド初期化 9{ 10 //初期化 11 ZeroMemory(g_Controllers, sizeof(CONTROLER_STATE) * MAX_CONTROLLERS); 12 13 XInputEnable(true); 14 15 return true; 16 17} 18 19//------------------------------------------- 終了処理 20void UninitPad(void) 21{ 22 //パラメータのリセット 23 ZeroMemory(g_Controllers, sizeof(CONTROLER_STATE) * MAX_CONTROLLERS); 24 25 //バイブレーション停止 26 for (DWORD i = 0; i < MAX_CONTROLLERS; i++) 27 XInputSetState(i, &g_Controllers[i].vibration); 28 29 XInputEnable(false); 30} 31 32//------------------------------------------ 更新 33void UpdatePad(void) 34{ 35 for (DWORD i = 0; i < MAX_CONTROLLERS; i++) 36 { 37 XInputSetState(i, &g_Controllers[i].vibration); 38 39 g_Controllers[i].lastState = g_Controllers[i].state; 40 41 //正常:ERROR_SUCCESS 0 42 //接続無し:ERROR_DEVICE_NOT_CONNECTED 1167 43 DWORD result; 44 result = XInputGetState(i, &g_Controllers[i].state); 45 46 //トリガー作成 47 g_Controllers[i].trigger.Gamepad.wButtons = ((g_Controllers[i].lastState.Gamepad.wButtons ^ g_Controllers[i].state.Gamepad.wButtons) & g_Controllers[i].state.Gamepad.wButtons); 48 49 //左スティック情報の作成 50 float LX = g_Controllers[i].state.Gamepad.sThumbLX; 51 float LY = g_Controllers[i].state.Gamepad.sThumbLY; 52 53 float magnitude = sqrtf((LX * LX) + (LY * LY)); 54 55 if (magnitude > 32767) 56 magnitude = 32767; 57 58 magnitude -= DEADZONE; 59 60 if (magnitude <= 0) 61 { 62 g_Controllers[i].state.Gamepad.sThumbLX = 0; 63 g_Controllers[i].state.Gamepad.sThumbLY = 0; 64 } 65 66 if(g_Controllers[i].state.Gamepad.sThumbLX >= 0) 67 g_LeftStickX[i] = (float)g_Controllers[i].state.Gamepad.sThumbLX / 32767; 68 else 69 g_LeftStickX[i] = (float)g_Controllers[i].state.Gamepad.sThumbLX / 32768; 70 71 if (g_Controllers[i].state.Gamepad.sThumbLY >= 0) 72 g_LeftStickY[i] = (float)g_Controllers[i].state.Gamepad.sThumbLY / 32767; 73 else 74 g_LeftStickY[i] = (float)g_Controllers[i].state.Gamepad.sThumbLY / 32768; 75 76 //右スティック情報の作成 77 float RX = g_Controllers[i].state.Gamepad.sThumbRX; 78 float RY = g_Controllers[i].state.Gamepad.sThumbRY; 79 80 magnitude = sqrtf((RX * RX) + (RY * RY)); 81 82 if (magnitude > 32767) 83 magnitude = 32767; 84 85 magnitude -= DEADZONE; 86 87 if (magnitude <= 0) 88 { 89 g_Controllers[i].state.Gamepad.sThumbRX = 0; 90 g_Controllers[i].state.Gamepad.sThumbRY = 0; 91 } 92 93 if (g_Controllers[i].state.Gamepad.sThumbRX >= 0) 94 g_RightStickX[i] = (float)g_Controllers[i].state.Gamepad.sThumbRX / 32767; 95 else 96 g_RightStickX[i] = (float)g_Controllers[i].state.Gamepad.sThumbRX / 32768; 97 98 if (g_Controllers[i].state.Gamepad.sThumbLY >= 0) 99 g_RightStickY[i] = (float)g_Controllers[i].state.Gamepad.sThumbRY / 32767; 100 else 101 g_RightStickY[i] = (float)g_Controllers[i].state.Gamepad.sThumbRY / 32768; 102 } 103}

inputx.h

1#pragma once 2 3#include <XInput.h>

XInput.h

1/*************************************************************************** 2* * 3* XInput.h -- This module defines XBOX controller APIs * 4* and constansts for the Windows platform. * 5* * 6* Copyright (c) Microsoft Corp. All rights reserved. * 7* * 8***************************************************************************/ 9#ifndef _XINPUT_H_ 10#define _XINPUT_H_ 11 12#include <windef.h> 13 14// 15// XInput APIs 16// 17#ifdef __cplusplus 18extern "C" { 19#endif 20 21DWORD WINAPI XInputGetState 22( 23 __in DWORD dwUserIndex, // Index of the gamer associated with the device 24 __out XINPUT_STATE* pState // Receives the current state 25); 26 27DWORD WINAPI XInputSetState 28( 29 __in DWORD dwUserIndex, // Index of the gamer associated with the device 30 __in XINPUT_VIBRATION* pVibration // The vibration information to send to the controller 31); 32 33DWORD WINAPI XInputGetCapabilities 34( 35 __in DWORD dwUserIndex, // Index of the gamer associated with the device 36 __in DWORD dwFlags, // Input flags that identify the device type 37 __out XINPUT_CAPABILITIES* pCapabilities // Receives the capabilities 38); 39 40void WINAPI XInputEnable 41( 42 __in BOOL enable // [in] Indicates whether xinput is enabled or disabled. 43); 44

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

プロジェクトのリンカー設定を確認しました。
XIunpt.libがあるパスになっています。
<XInput.h>をインクルードしています。
別プロジェクトで動いたので今回のプロジェクトにコピーしました。

補足

visual studio 2022
DirectX SDK(June 2010)

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

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

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

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

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

hiroki-o

2024/02/24 09:55

そのような古いDirectX SDKを使わなくても、xinput.hもxinput.libも最新のWindows SDKに含まれています。仮にxinput.libがDirectX SDK側のパスとして、xinput.hはどちらを呼び出していますか? #include <xinput.h>のxinput.hの上で右クリックして、「ドキュメントに移動」を試してみてください。
otn

2024/02/24 10:01

> XIunpt.libがあるパスになっています。 タイプミスでは?
ranaka

2024/02/24 10:03

「ドキュメントに移動」でXInput.hに移動できます。 関係あるかわかりませんが、ソリューションの外部依存関係にもXInput.hがいます。 コピーしたプロジェクトにinputx.hとcppコピーしたのがいけなかったのでしょうか
hiroki-o

2024/02/24 10:09

そのxinput.hは、どちらですか? タブの上にマウスカーソルを当てて、パスを確認してください。
ranaka

2024/02/24 10:12

Direct SDKとWindowsどちらのXinput.hでもエラーになります。
hiroki-o

2024/02/24 10:20

上手く話が通じていないようですが、組み合わせとしては「DirectX SDKのxinput.hとDirectX SDKのxinput.lib」か「Windows SDKのxinput.hとWindows SDKのxinput.lib」のどちらかしかないです。 まず、自分がどちらを使いたいのか、現在のプロジェクトの設定がどちらを使っているのか、をはっきりさせたほうがよいと思います。
ranaka

2024/02/24 11:52

DirectXのximput.hとDirectXのximput.libで使いたいです。 別プロジェクトではそれで動いていました。 動いていたプロジェクトと今回のプロジェクトはどちらもDirectX SDKでやっているので設定の違いはないと思っています。
guest

回答2

0

自己解決

main.hに
#pragma comment (lib, "xinput.lib")
を書き忘れていただけでした。皆様ご協力ありがとうございました。

投稿2024/02/24 16:51

ranaka

総合スコア2

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

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

hiroki-o

2024/02/24 18:33

プロジェクトのリンカー設定が正しいなら、その記述は不要なのですが...解決したなら、おめでとうございます!
guest

0

その関数の実体が存在しない、というエラーなので、
ライブラリの指定が間違っていないか、
そのライブラリの中に、それらの関数が存在しているのか、
をチェックしましょう。

存在していないならば、どこからかそれを持ってくる必要がありますね

投稿2024/02/24 10:19

y_waiwai

総合スコア87981

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問