2016-08-11 41 views
0

MDビルドライブラリのデバッグバージョン(PocoFoundation mdd .libなど)を使用しているVS2012プロジェクトがあります。 #POCO_STATICが定義されており、すべてが良好です。 リリースモードでコンパイルする場合POCO:Releaseでプロジェクトをコンパイルするとき、リンカがMDライブラリの代わりにMTを要求する

、私は同じライブラリ(PocoFoundation MDの.lib)のリリースバージョンを使用しています - しかし、VS2012は、(突然にリンクすることを拒否し、代わりにMTバージョンを要求しますPocoFoundationmt.lib)POCO/VSは、MTのバージョンの代わりに、リリースモードでのMDのバージョンを探すために引き起こしている何

error LNK1104: cannot open file 'PocoFoundationmt.lib' 

?何か案は?

ここでVS2012は、DEBUGモード(作品)

/OUT:"C:\xxx...\xxx.dll" /MANIFEST /NXCOMPAT /PDB:"C:\xxx...\xxx.pdb" /DYNAMICBASE "ssleay32.lib" "libeay32.lib" "cpprest120d_2_8.lib" "log4cppD.lib" "winhttp.lib" "Crypt32.lib" "Bcrypt.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /IMPLIB:"C:\xxx...\xxx.lib" /DEBUG /DLL /MACHINE:X86 /INCREMENTAL /PGD:"C:\xxx...\xxx.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\xxx.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"..\libs\Poco\Debug" /TLBID:1 

に使用しています...と、ここで、リンカのコマンドは(動作しない)RELEASEモード

/OUT:"C:\xxx...\xxx.dll" /MANIFEST /LTCG /NXCOMPAT /PDB:"C:\xxx...\xxx.pdb" /DYNAMICBASE "ssleay32.lib" "libeay32.lib" "cpprest120_2_8.lib" "log4cppLIB.lib" "winhttp.lib" "Crypt32.lib" "Bcrypt.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /IMPLIB:"C:\xxx...\xxx.lib" /DEBUG /DLL /MACHINE:X86 /OPT:REF /SAFESEH /INCREMENTAL:NO /PGD:"C:\xxx...\xxx.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Release\xxx.dll.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"..\libs\Poco\Release" /TLBID:1 
のためだとリンカのコマンドがあります
+2

https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Foundation。h#L77 –

+0

@HansPassantこのURLは本当に問題を解決するのに役立ちます。私たちはそれを答えにするべきですか? –

答えて

-1

デバッグモードでコンパイルされたライブラリは、多くの場合、リリースモードライブラリとはかなり異なる場合があります。

  • 彼らは、デバッグとリリースの間にコードの最適化の違いは全体があるかもしれません
  • クロスコンパイルを防止するのに十分なほど重要となる可能性
  • リリース
  • にコンパイラに表示されないエラー処理/デバッグメッセージを持つことができます特定の状況下では、デバッグとリリースの機能レベルが異なります。

一般的に、あなた自身が特にそれらのライブラリの生成を担当しているのでなければ、DebugとReleaseのバージョンを別々に取得し、それぞれの設定に対して正しいものを取得するようにプロジェクトを設定する必要があります。

+0

はい - 私はすでにこれをやっています - 私の投稿を読んでください:) –

+0

@NjålArneGjermundshaug "#POCO_STATIC'を定義しています"と言っているだけでは、それは正しく使用されています。 – Xirema

+0

#define POCO_STATIC は、POCOを使用するcppファイルの先頭に含まれています。ソリューションはコンパイルされ、DEBUGモードで正常に動作します。 My Releaseの設定はDebugと同じですが、POCOリリースのlibsがライブラリディレクトリに含まれ、デバッグライブラリには含まれていません。 POCO_STATICは、デバッグとリリースの両方の構成のプリプロセッサ定義に含まれています。 これはデバッグ時に正常にコンパイルされます。リンカは参照して、libsのMDDバージョンを使用します。リリースでは、リンカはlibのMDバージョンを使用する必要がありますが、何らかの理由でMTバージョンの使用を主張します。 –

1

あなたのコンパイルコマンドラインがどのように見えるか分かりにくいです。おそらく、ヘッダーの1つにPOCO_STATICを定義するでしょうか?その定義はFoundation.hが既に含まれていて、リンクがthis logicに従って行われた後に発生する可能性があります。リリースとデバッグの間にインクルードに違いがあるかもしれません。または、実際にはデバッグ時にmtd.libとリンクしていて、 `PocoFoundationmtd.libをビルドしていますが、PocoFoundationmt.libをビルドしていないかもしれないので、リリースビルドはそれを見つけることができません。

this answerを読むことが役立ちます。プリプロセッサの定義にPOCO_STATIC_DLLを追加

0

はそれを修正しました!

(私もMDに同じプロジェクト内の他のすべてのLIBSを再コンパイル - いくつかのMTのLIBSはそこにあったからです。)

感謝を!

+1

*自分では '_DLL'を定義しないでください。これは組み込みマクロで、/ MDを使用すると自動的に定義されます。あなたはビルドのバグを隠しています。そのバグは非常にぎこちないリンカエラーと非常に厄介なランタイムエラーを引き起こす可能性があります。あるコードが/ MTでコンパイルされているという堅実な証拠がある場合は、それを見つけなければなりません。 –

+0

あなたは100%ハンスだと思います。すべての設定をもう一度行って、すべてのC++>コード生成>ランタイムライブラリが/ MDに設定されていることを確認した後、プリプロセッサ定義で_DLLなしで動作します。 これらの問題が発生したときには、/ MTがどこかにいる必要があります。 –

関連する問題