web-dev-qa-db-ja.com

そこにあるべきではないランダムな未解決の外部シンボル

私はLinux用にコンパイルすることに慣れているので、この.libのものは私にとって少し奇妙です。 Visual Studioでのプログラムでは、他のライブラリやMicrosoftランタイムの未解決の外部シンボルをランダムに取得し続けます。

1>glfw3.lib(init.c.obj) : error LNK2019: unresolved external symbol __imp__vsnprintf referenced in function __glfwInputError
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp__vsnprintf
1>glfw3.lib(context.c.obj) : error LNK2019: unresolved external symbol __imp__sscanf referenced in function _parseVersionString
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp___vsnprintf
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\OLDNAMES.lib : warning LNK4272: library machine type 'UNKNOWN' conflicts with target machine type 'X86'

私はこれらのライブラリのみを含めており、それらが見つかっていることを確認できます。

x86/glew32s.lib
x86/glfw3.lib
x86/glfw3dll.lib
opengl32.lib

継承された値を使用して:

kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib

これが正確な順序であることを確認できます。 Windows 7SDKとVisualStudioをインストールして再インストールしようとしました-私もWindows7を使用しています。

この問題に関するサポートをいただければ幸いです。必要に応じて、さらに情報を提供させていただきます。

ありがとう、ボンシー

11
Boncey

問題は、glfw静的ライブラリが使用しているものとは異なるバージョンのVisualStudioで構築されていることです。 2015年春の時点で、glfw.orgにあるビルド済みのものは、Visual Studio 2015 RC(使用しているように見えます)と互換性がありません。

幸い、GLFWはパーミッシブライセンスの下でリリースされた小さなコードベースであるため、最も簡単な解決策は、ソリューション内にGLFW用の新しいプロジェクトを作成することです。手順は次のようになります。

  1. ソリューションに新しい空のプロジェクトGLFWを作成します。
  2. include、_deps/GL_にコピーし、srcフォルダーを作成します。
  3. サポートするプラットフォームのすべてのソースファイルをsrcフォルダーにコピーします。 Windowsの場合、これはwinまたはwglプレフィックスが付いているか、プレフィックスがないすべてです。あなたはすべてのcmakeのものを無視することができます。
  4. _glfw_config.h_、_#defines_、および__GLFW_WIN32_の__GLFW_WGL_を含む__GLFW_USE_OPENGL_という名前のファイルをsrcに作成します。ウィンドウ以外のものをサポートしたい場合は、このファイルで必要なオプションを条件付きで定義する必要があります。すべてのオプションは_src/glfw_config.h.in_で説明されています。
  5. 関連するすべてのファイルをVisualStudioプロジェクトに追加します。
  6. プロジェクトオプションで、構成タイプを静的ライブラリに設定します。 [C/C++]> [一般]で、SDLチェックが無効になっていることを確認します。そして、プリプロセッサの下で、定義に__GLFW_USE_CONFIG_H_を追加します。
  7. (右クリックメニューで)GLFWプロジェクトに依存するようにメインプロジェクトを設定します。最後に、正しいGLFWライブラリをリンカーの依存関係に追加します。 (GLFWの出力ディレクトリを設定しているので、正しいlibは$(SolutionDir)GLFW\$(Platform)\$(Configuration)\glfw.libです。)
9
Dan

リンカー入力にライブラリを追加することもできます。つまり、legacy_stdio_definitions.lib

[プロパティ]> [リンカー]> [入力]に移動します。

そして、追加の依存関係に上記のライブラリを追加します。

18
Gurjot Bhatti

動的ランタイムライブラリリンクと静的ランタイムライブラリリンクの間に誤接続があるようです。シンボルの「__imp」プレフィックスは、コードがDLLから何かを探していることを意味しますが、リンクしているライブラリはおそらく静的ランタイムライブラリを期待しています。

プロジェクトのプロパティページ([ビルド]-> [プロパティ]の下)を表示し、左側でC++カテゴリを探します。 「コード生成」の下に「ランタイムライブラリ」というエントリがあります。デバッグモードでコンパイルしているように見えるため、これはおそらく現在マルチスレッドデバッグDLL(/ MDd)に設定されています。これをマルチスレッドデバッグ(/ MTd)に変更し、すべてを再コンパイルします。それが機能するかどうかを確認します。

0
Mark Morrison