web-dev-qa-db-ja.com

未解決の外部シンボル__vsnprintf ....(dxerr.lib内)?

Windows 7およびVisual Studio Community 2015 RCでDirectX 11アプリケーションを実行しています。 DX SDKの関数をまだ使用しています。 VS2013では正常に機能しましたが、切り替えたときに次のエラーのみが表示されました。

Error   LNK2019 unresolved external symbol __vsnprintf referenced in function "long __stdcall StringVPrintfWorkerA(char *,unsigned int,unsigned int *,char const *,char *)" (?StringVPrintfWorkerA@@YGJPADIPAIPBD0@Z)   Ancora  D:\Moody\Moody\Projects\Projects\Ancora\Ancora\dxerr.lib(dxerra.obj)    1

DxerrライブラリのDXGetErrorDescriptionA関数のみを使用し、コメントアウトすると、プログラムは正常にコンパイルされます。私は何が間違っているのか分かりませんが、DX SDKからのものではないか、そうでなければ他の機能が正しく失敗しますか?

21
Moody

DXGetErrorMessage()Dx9を使用して同じ問題を経験し、MSがこの問題に対処するためにAdditional Dependenciesプロパティページに含める追加のライブラリを提供していることがわかりました。ライブラリー名は:legacy_stdio_definitions.lib

これを追加することで問題が解決しました。

47
LaurieW

Dxerr.libを手動でハッキングする代わりに、次を追加できます。

#include <Windows.h>
#include <stdio.h>
int (WINAPIV * __vsnprintf)(char *, size_t, const char*, va_list) = _vsnprintf;

コードのどこかに

22
user5477957

追加するだけ

#pragma comment(lib, "legacy_stdio_definitions.lib")

https://msdn.Microsoft.com/en-us/library/bb531344.aspx

6
Masaki Ohashi

使用しているDirectXライブラリは、使用しているVisual Studioの古いバージョンでコンパイルされています。 Microsoftは、Cランタイムに変更を加えて、異なるバージョンでコンパイルされたライブラリ間の非互換性を作成することがあります。 __vsnprintfは、Cランタイムの古いバージョンの内部シンボルでしたが、2015 RCバージョンには存在しません。

残念ながら、dxerr.lib(およびd3dx11.lib)は deprecated になっています。 2つのオプションがあります-VS2013に切り替えるか、dxerr.libの機能の使用を停止できます。 FormatMessage nowを使用して機能を複製できるため、後者の方がおそらく優れています(リンクされた記事の詳細)。

4
MuertoExcobito

HACKYですが、dxerr.libにパッチを当てることができます。

__vsnprintfを_vsnprintfに置き換えます(最初に削除されたアンダースコアを考慮して、末尾にnullを付けます)

3
cgp1024

従来のDirectX SDKは非常に古く、dxerr.libは、DXSDKのVS 2015のCランタイムと互換性がありません。

一般に、コードを含む静的ライブラリは、異なるバージョンのコンパイラからうまく混ざりません。従来のDirectX SDKのほとんどの.libは、dllまたはすべてのデータライブラリのインポートライブラリであり、コードがまったく含まれていないため、VS 2015で動作します。 DXSDKはVS 2010から更新されていません。

VS 2015で使用されるWindows 8.x SDKとレガシーDirectX SDKを混合する適切な方法で [〜#〜] msdn [〜#〜] の指示を必ず読んでください。このプロジェクトでは、dxerr以外のレガシーDirectX SDKの何かを使用します。

レガシーのDirectX SDKのこの依存関係を取り除くために、プロジェクトのソースからビルドできるDXERRのバージョンを実装しました。詳細については this post をご覧ください。つまり、意図的にUnicode(Wバージョン)のみをサポートしました。 ANSI(Aバージョン)を簡単に作成する方法は十分に考えられますが、ユニコードを使用するようにアプリを更新するのが最善です。

DirectX SDK(2015 Edition)はどこですか? および Direct3D 11のDXUT を参照してください。

UPDATE:別の回答に記載されているように、legacy_stdio_definitions.libは、古いレガシーDirectX SDKバージョンのdxerr.lib VS 2015/2017と再度リンクします。ただし、レガシーDirectX SDKの依存関係を可能な限り削除する必要があり、DXERRは独自のモジュールに簡単に置き換えられます。 D3DXなしの生活 を参照してください。

3
Chuck Walbourn

プラットフォームツールセットをVisual Studio 2015からVisual Studio 2013に変更してからコンパイルできます。プラットフォームツールセットは、プロジェクトプロパティの[全般]タブにあります。

1
Raymond Trel