web-dev-qa-db-ja.com

「LIBCMT」は他のライブラリ+未解決の外部シンボルの使用と競合します

OpenGL 3.2(+ libs)とFreeType2を使用するプログラムがあります。次に、BoostとOpenSSLを使用する他のプログラム。 OpenGL側はテキストがレンダリングできることを確認することでした、そしてboost/opensslプログラムは安全なログイン/ゲームサーバーを行うことです。

どちらのプログラムも、自分自身で問題なく動作します。

ただし、ゲーム(GL + freetype)プロジェクトにBoostとOpenSSLを追加すると、リンクに失敗しました。

次のライブラリをリンクし、そこにincludeフォルダーを含めました。

glimg.lib glutil.lib glfw.lib opengl32.lib freetype.lib glew32.lib user32.lib libeay32.lib ssleay32.lib

リンカエラーです。

1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__DeregisterEventSource@4
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__ReportEventA@36
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__RegisterEventSourceA@8
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteObject@4
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetBitmapBits@12
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__BitBlt@36
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetObjectA@12
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__SelectObject@8
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleBitmap@12
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetDeviceCaps@8
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleDC@4
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateDCA@16
1>.\BasicTexture.exe : fatal error LNK1120: 13 unresolved externals

ランタイムライブラリがマルチスレッドに設定されているDLL(/ MD)

私は何をすべきか分かりません。

17
Andrew

コンパイラーが外部で定義されたオブジェクトまたは関数を参照するコードを生成し、リンカーがそれらを見つけられない場合、未解決の外部エラーメッセージが生成されます。関数呼び出しを呼び出すコードを生成するには、コンパイラーは宣言のみが必要です。

extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );

これは、call命令を生成するのに十分な情報です(ターゲットアドレスを除く)。 externキーワードは、実装が別の場所で定義されていることをコンパイラに通知します。したがって、後で入力する必要があるターゲットアドレスを知ることはできません。コンパイラーが完了したら、断片を結合するのはリンカーの仕事です。インポートライブラリから収集した情報を使用して、必要なオフセットを検索します。

Windows API呼び出しは、エラーログで簡単に見つかります。それらには__imp__接頭辞があり、AまたはW接尾辞の後に@<n>が続く場合があります<n>は、引数に必要なバイト数を示します。 Windows API呼び出しの場合、MSDNで関数を検索できます( DeregisterEventSource など)。下の方に要件があり、そこにインポートライブラリ名があります。

競合の警告は、すべてのモジュールが同じランタイムライブラリを使用するわけではないことを示しています。これは単なる警告ですが、深刻な問題であり、解決する必要があります。 /MD/MTのコンパイラスイッチを混在させると、この警告が表示されます。また、リリースライブラリとデバッグランタイムライブラリ(/MD/MDdなど)を混在させると、この警告が表示されます。このメッセージを診断するには、 /VERBOSE:LIB リンカースイッチを使用して、リンカーが検索しているライブラリを特定できます。この警告の詳細については、 MSDNリンク を参照してください。

22
IInspectable

おそらく正しい選択である/MDを使用してコンパイルしようとしていますが、一部のコード(おそらくライブラリの1つ)が/MTを使用してビルドされているため、同じ方法で両方を使用することはできませんプログラム。 /MTでビルドされたライブラリを特定し、/MDで再構築する必要があります。

24
Adrian McCarthy