11

OpenGL 3.2(+ libs)とFreeType2を使用するプログラムがあります。 BoostとOpenSSLを使った他のプログラム。 OpenGL側は、テキストをレンダリングできるようにし、boost/opensslプログラムは安全なログイン/ゲームサーバーを実行することでした。'LIBCMT'は他のlibs +未解決の外部シンボルの使用と競合します

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

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

私は以下のライブラリをリンクしていますが、そこにはフォルダも含まれています。

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 [email protected] 
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>.\BasicTexture.exe : fatal error LNK1120: 13 unresolved externals 

ランタイムライブラリは、私は私は本当に任意の助けをいただければ幸いです何をすべきか見当がつかないマルチスレッドDLL(/ MD)

に設定されています。

+3

未解決の外部は、必要なライブラリ( 'Advapi32.lib'と' Gdi32.lib')とリンクしていないためです。最初の警告は、プロジェクトと、リンクしているライブラリのいくつかが、CRTに関して互換性のないリンカー設定を持っていることを示しています。それ以外は、Unicodeビルドをコンパイルしていないようです。それには理由がありますか? – IInspectable

+0

ありがとうTim。私はちょうどpremake4を使ってvs solitionを作成し、必要なものを変更しました(私はunicodeのためにyesを選択しました)。あなたはそれを固定しているので、答えを出してもらいたいですか?ビルドは成功しました。どうもありがとうございました! :) – Andrew

答えて

13

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

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 linkにあります。

+1

__imp__接頭辞はWindows API呼び出しを意味するという洞察のために+1してください。リンカエラーの前にそのプレフィックスを見たことがありますが、なぜシンボルに接頭辞が付いていたのかわかりませんでした。 – riderBill

16

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

+1

、または犯人用のソースがない場合は、プロジェクトを '/ MT'とリンクしてください。 – AShelly

+0

返信いただきありがとうございます。問題は1時間ほどの質問のコメントにTimによって解決されました。私は彼に答えを受け入れたいと思います。しかし+1。なぜなら、質問を投稿する前にすべてがMDスレッドであることを確認したからです。 – Andrew

関連する問題