24

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

両方のプログラムは、自分自身で正常に動作します。

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

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

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) に設定されている

どうすればいいのかわからないので、助けていただければ幸いです。

4

2 に答える 2

30

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

于 2013-01-04T00:47:01.610 に答える
27

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

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 リンクにあります。

于 2013-01-04T13:33:41.873 に答える