

リソースからバージョンを取得するために以下リンク先のソースコードを使用してみたのですが、タイトルのようなエラーが発生しています。

[C++でバージョン情報を取得する](https://araramistudio.jimdo.com/2017/05/19/c-%E3%81%A7%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)

色々なファイルのインクルードもしてみたり、他の似たようなサイトで調べたりもしましたが、解決できておりません。  
ご助力の程宜しくお願い致します。


CC BY-SA 4.0
2022-09-28T04:50:04.840
91343
2022-09-28T07:07:13.330
2022-09-28T05:02:56.397
3060
47970
question
c++
visual studio 2019にて未解決の外部シンボル(VerQueryValueW)・(GetFileVersionInfoW)・(GetFileVersionInfoSizeW)の参照エラーを修正できない。


>
> 未解決の外部シンボル(VerQueryValueW)・(GetFileVersionInfoW)・(GetFileVersionInfoSizeW)の参照エラー

「未解決の外部シンボル～」といったエラーメッセージは、コンパイル時ではなくリンク時の問題を示しています。

例えば[`GetFileVersionInfoW`関数の仕様](https://learn.microsoft.com/en-
us/windows/win32/api/winver/nf-winver-
getfileversioninfow#requirements)をドキュメントで確認すると、ソースコードから#includeすべきヘッダファイルは`Windows.h`を、リンク時に追加指定するライブラリファイルは`Version.lib`が必要なことが分かります。

> Header: winver.h (include Windows.h)  
>  Library: Version.lib


CC BY-SA 4.0
2022-09-28T05:36:58.530
91346
2022-09-28T05:36:58.530
49
91343
answer


こういう時は公式ページ (Microsoft MSDN) を見る癖をつけてください。 Google でも Bing でもいいので
`VerQueryValue` を検索し Microsoft の解説ページを見つけます。  
[VerQueryValueW](https://learn.microsoft.com/en-
us/windows/win32/api/winver/nf-winver-verqueryvaluew)  
すると Requirement の欄に `Header` と `Library` の解説があります。

（今回は該当しませんが）コンパイル時に未宣言シンボルというエラーが出るときは、ソースコード上 `Header` の追加が抜けています。適切なところに
`#include` を追加します。この例の場合、解説ページの読み方が難しいのですが `#include <windows.h>`
しろと書かれています（宣言自体は `winver.h` にあるのですが、直接 `#include <winver.h>` するのではなく `#include
<windows.h>` しろと指定されています）  
# プリコンパイルヘッダを使っている場合などには「適切」がどこかは悩ましい

（今回はこちらが該当）リンク時に未解決シンボルがあるエラーの場合は解説ページ上 `Library` を追加します。 `version.lib`
を追加しろとの解説がありますね。ではどうやって追加するか、ですが VS2019 の IDE 画面上のメニューバー プロジェクト(P) → プロパティ (P)
から追加します。プロパティページ画面が開くので左ペイン「リンカー→入力」を選ぶと右ペインに「追加の依存ファイル」がたくさん並んでいるはず。ここに
`version.lib` が無いはずなので、適当な場所に追加します。よく見ると区切り記号は `;` なことがわかるので
`version.lib;kernel32.lib;....`
のように追加することでリンクが通るようになります（最初に追加するか末尾に追加するかで意味が違いますが、この例ではどちらでも可）

ところがこのプロパティページ、よく見ると上のほうに「構成」と「プラットフォーム」というのがあります。「構成」には `Debug` と `Release`
が、「プラットフォーム」には `Win32` と `x64` があります（ `x64`
は出ない場合もあります）２種類ｘ２種類で４つのプロパティページのすべてに追加変更を行っておくことをお勧めします。


CC BY-SA 4.0
2022-09-28T05:41:15.337
91347
2022-09-28T05:41:15.337
8589
91343
answer


原因や対処については既に回答されている通りですが、対処については Visual C++ 限定で簡略化出来る方法があります。

こちらの記事で解説されているもので、プリプロセッサへの指令でリンクするライブラリをソースコードに明記する方法です。  
[comment pragma](https://learn.microsoft.com/ja-jp/cpp/preprocessor/comment-c-
cpp?view=msvc-170)  
[lib](https://learn.microsoft.com/ja-jp/cpp/preprocessor/comment-c-
cpp?view=msvc-170#lib)

> オブジェクト ファイル内にライブラリ検索レコードを配置します。

[例](https://learn.microsoft.com/ja-jp/cpp/preprocessor/comment-c-
cpp?view=msvc-170#examples)

> #pragma comment( lib, "emapi" )

上記を適用して質問内容に合わせると、ソースコード上の`#include`等に続けて以下を記述しておけば、プロジェクトのプロパティに幾つのプラットフォーム(Win32/x86/x64/他)や構成(Debug/Release/他)の別が有るかを気にせずどのようなモードを選んでもビルド出来ます。

[code]

    #pragma comment( lib, "version" )
    
[/code]


CC BY-SA 4.0
2022-09-28T07:01:17.757
91349
2022-09-28T07:07:13.330
2022-09-28T07:07:13.330
26370
26370
91343
answer