お世話になります。プログラミングの経験がほとんど無い初心者です。あるゲームソフトのSDKを使い自作デバイスでゲームを操作するプログラムを作りたいのですが、そのテスト段階で躓いています。(ご参考まで→ttp://www.lekseecon.nl/sdk.html)
なおIDEはVC++2008ExpressEditionを使っています。エラーの内容は次の通りです。
**************
1>------ ビルド開始: プロジェクト: PC19, 構成: Debug Win32 ------
1>コンパイルしています...
1>PC19.cpp
1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C2146: 構文エラー : ';' が、識別子 'LVLDSession' の前に必要です。
1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
**************
原因となったLVLD_SDK.h中のエラー対象行周辺は次の通りです。
**************
#define SDK_VERSION 202
#define OPEN1
#define CLOSE 0
//(省略)
__declspec(dllexport) LRESULT LVLDSession (int flag,int LVLDVersion); //※エラー行です
//(省略)
********************
プログラム本体についてはまず新規プロジェクトでWindowsフォームアプリケーションを準備し、Timerを組み込みました。SDKには3つのファイル、LVLDSDK.dll、LVLDSDK.lib、LVLD_SDK.hが内包されており、これらすべてをプロジェクトフォルダーにコピーしました。ソリューションエクスプスローラーでLVLD_SDK.hをヘッダーファイルフォルダーに、LVLDSDK.libをリソースフォルダーに参照させました。またプロジェクトのプロパティのリンカの入力、追加の依存ファイルにLVLDSDK.libを追加しました。他のコンパイル時エラーへの対応として、構成プロパティ、全般、共通言語ランタイムサポートを/clrへ変更しています。 Form1.hの先頭行近くに #include "LVLD_SDK.h" を追加し、Timerイベント内に動作確認用の命令を記述しました。
**Form1.h抜粋*****
#pragma once
#include "LVLD_SDK.h"
(中略)
#pragma endregion
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
signed int result0;
result0=LVLDSession(OPEN,SDK_VERSION);
}
(中略)
**********
3種類のエラーが出ていますが関連性がよく分からず、まとめて質問する形になってしまいました。質問に不備がありましたらそれも叱咤ご教授いただければと思います。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
お疲れ様です。
多分「LRESULT」が何か認識しきれていないのだと思います。
たしか、「windows.h」さえ読み込めば定義されているはずなので、
「Form1.h」で読み込むか、「Form1.h」を使用している箇所で読み込むかのどちらかになります。
●「Form1.h」で読み込む場合
#include <windows.h>
#pragma once
#include "LVLD_SDK.h"
(中略)
#pragma endregion
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
signed int result0;
result0=LVLDSession(OPEN,SDK_VERSION);
}
(中略)
●「Form1.h」を使用する側で読み込む場合
#include<windows.h>
#include"Form1.h"
即時のご回答に感謝感激しております。大変ありがとうございました。
教えて頂いた方法で、先の問題は無事解決することができました。
しかし新たな問題に頭を抱えています。
ここで引き続きお伺いしてもよろしいでしょうか。
エラーメッセージは次のとおりです。
**********
1>リンクしています...
1>PC19.obj : error LNK2028: 未解決のトークン (0A00001B) "long __cdecl LVLDSession(int,int)" (?LVLDSession@@$$FYAJHH@Z) が関数 "private: void __clrcall PC19::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@PC19@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。
1>PC19.obj : error LNK2019: 未解決の外部シンボル "long __cdecl LVLDSession(int,int)" (?LVLDSession@@$$FYAJHH@Z) が関数 "private: void __clrcall PC19::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@PC19@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。
1>F:\PIC\MyPrograms\PC\PC19\Debug\PC19.exe : fatal error LNK1120: 外部参照 2 が未解決です。
*************
よろしくお願いします。
No.4
- 回答日時:
これは #1 の補足への回答です。
リンク先を見ると
The SDK contains functions and data definitions in the C-language
となってるので、(C++ではなく)Cとしてコンパイルする必要がありそうです。
#2 さんが指摘している「SDK自体のリンケージ規約がC言語」だと思います。
いま手元にはVS2008しかないのですが、
プロジェクト => (プロジェクト名)のプロパティ
構成プロパティ => C/C++ => 詳細
コンパイル言語の選択
の設定を
C++コードとしてコンパイル (/TP) <= デフォルト
Cコードとしてコンパイル (/TC) <= 修正後
にすれば良いのではと思います。
もしくは、ヘッダ内の C 関数プロトタイプ宣言を
#ifdef __cplusplus
extern "C" {
#endif
関数プロトタイプ宣言
…
#ifdef __cplusplus
}
#endif
のように、extern "C" { ~ } で囲むかです。
ふつうはライブラリ用ヘッダはこのような書き方になっているはずですが、
「functions and data definitions in the C-language」と明示しているくらいなので、
最初の案のほうがいいかも知れませんね。
※経験則からいうと、C と C++ が混在するような状況での
リンクエラーやマングル/デマングルに関する問題は初心者では解決できないのではないかと思います。
(自分も過去に悩んだことがあるし、後輩がこの問題に悩むのも何回か見てきた)
はっきりこのことを書いてる初心者向けの本はあまり見たこと無い。
ご指摘ありがとうございます。
hiro_knighさんへのお礼欄にも書きましたがSDKのReadmeにもC言語との記述がありました。お恥ずかしながらCとC++の混在が好ましくないことさえ認識していなかった、というのが正直なところです。
アドバイス頂いた[Cコードとしてコンパイル (/TC) ]を試したところ、Cに無い記述方法を指摘する(!?)エラーが沢山出てきてしまいました。
限界は感じますが解決方法はあるのですね。 ここはクローズしますが粘り強く続けてゆこうと思います。ありがとうございました。
No.3
- 回答日時:
まず自称初心者の方は自力でプログラムを書いて、それをコンパイルさせる能力を習得する事を目標として勉強すると良いと思います。
>1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C2146: 構文エラー : ';' が、識別子 'LVLDSession' の前に必要です。
このエラー内容を質問して、プログラムの間違いを他の方に指摘してもらって、修正して意味があるでしょうか?
次のプログラムを作る時に同じエラーが出たときに自力で解決できるようにならないと、いつまで経っても初心者を卒業できません。
まずはエラー内容を理解する努力をしましょう。理解できないならエラーコード(上の例ならC2146)を検索サイトやMSNDで検索して詳細情報を得る努力をすると良いですよ。
自力で調べて理解出来ない事を教えてもらうようにしないと、いつまで経っても自分の知らないコンパイルエラーが発生した時に他人に助けてもらわないと解決できなくなってしまいます。
ちなみにVCならコンパイル時のエラーメッセージを(ダブル?)クリックするとエラーだとコンパイラが判断したコードをすぐ参照できます。
やや手痛いご意見ながら確かにおっしゃるとおりでして、コメント頂いたことを感謝しております。 アドバイスを参考にもっと勉強してから出直したいと考えています。
bravheartさん始めコメント頂いた皆様方、本当にありがとうございました。
No.2
- 回答日時:
コンパイルまでは正常終了して、リンクでエラーとなっています。
ライブラリの参照方法ですが、「LVLDSDK.libをリソースフォルダーに参照させました」の方法は違うのではなかったかと記憶しています。
「プロジェクト(P)」→「~のプロパティ(P)」→構成を「全ての構成」に変更→「リンカ:追加のライブラリディレクトリ」でlibを格納したフォルダを指定すればよかったはず。。。
それでも駄目なら、そのSDK自体のリンケージ規約がC言語の物の可能性があります。。。
教えて頂いたリンク方法を試しましたが症状は変わりませんでした。
すべてhiro_knighさんが予想されたとおりで、このライブラリはC言語のものでした。 ( SDKに同封されていたReadmeにも"How to use this SDK....for C developpers"と書いてありました ) 続きはz64423さんの欄に書くことにしますがここではお礼申したく、大変ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- PHP php エラー 2 2022/10/23 16:43
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- PostgreSQL PostgreSQL14.6のSSL対応について 1 2023/01/05 15:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
intel fortranのエラーで困って...
-
43:syntax error at end of input
-
C言語のプログラムが実行できま...
-
対応する関数ヘッダーがありません
-
フォートランのエラーについて...
-
他クラスからForm1内コントロル...
-
pythonの条件分岐(if)
-
verilogでデマルチプレクサの作...
-
解説サイトに従ったfortran並列...
-
構造体のポインタ参照
-
エクセルで特定の列が0表示の場...
-
教えて下さい
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
UserForm1.Showでエラーになり...
-
エクセル関数を教えてください
-
特定のPCだけ動作しないVBAマク...
-
EXCELのVBAでRange("A1:C4")を...
-
一つのTeratermのマクロで複数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
intel fortranのエラーで困って...
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
pythonの条件分岐(if)
-
対応する関数ヘッダーがありません
-
43:syntax error at end of input
-
Excel VBA: UserForm.Show で実...
-
フォートラン(fortran)のエラー...
-
#ifndefとかヘッダファイルにつ...
-
Delphiでif文がうまく書けないです
-
AccessVBAでVLookupを使いたい
-
typedef による2重定義
-
構造体のポインタ参照
-
C言語のプログラムが実行できま...
-
DLLの使い方とerror C2146につ...
-
VB2005でOCXを動的に呼び出すに...
-
解説サイトに従ったfortran並列...
-
Makefile と <math.h>
-
python numpy.linalg.inv()での...
おすすめ情報