1

私が作成したライブラリに静的にリンクする MFC アプリケーションがあり、両方のプロジェクト (1.51) でブーストも使用しています。

動的にリンクされたランタイムとブースト ライブラリ (私のライブラリは静的にリンクされています) を使用すると、すべてうまくいくようです。

しかし、.exe を同僚に簡単に配布できるように、静的にリンクされたバージョンを作成したいと考えていました。おそらく動的リンクに戻ってMSIなどを使用できることは理解していますが、問題で何が起こっているのかを理解したい...

そのため、最終的にコンパイルするようになりましたが、次のような LN4049 警告なしではありません。

MyLib.lib(MyModule.obj) : warning LNK4049: locally defined symbol _printf imported

MSDN のドキュメントでは、これは dll のエクスポート/インポート宣言が原因であることが示唆されていますが、少なくとも私のコードにはこれらがなく、他にどこから来ているのかわかりません。

正常にコンパイルする前に、DLL インポート ライブラリに関連する多くのリンカー エラーが発生していました (シンボルの競合/再宣言)。

1>boost_system-vc100-mt-gd-1_51.lib(boost_system-vc100-mt-gd-1_51.dll) : error LNK2005: "class boost::system::error_category const & __cdecl boost::system::system_category(void)" (?system_category@system@boost@@YAABVerror_category@12@XZ) already defined in libboost_system-vc100-mt-sgd-1_51.lib(error_code.obj) 
1>boost_system-vc100-mt-gd-1_51.lib(boost_system-vc100-mt-gd-1_51.dll) : error LNK2005: "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (?generic_category@system@boost@@YAABVerror_category@12@XZ) already defined in libboost_system-vc100-mt-sgd-1_51.lib(error_code.obj)

などで、これらの DLL インポート ライブラリを無視する必要がありました。

MSVCRTD.lib, msvcprtd.lib, & boost_system-vc100-mt-gd-1_51.lib

これらが DLL リンク用のインポート ライブラリであることは理解しています。BOOST_LIB_DIAGNOSTIC の出力は、私がリンクしているすべての静的ブースト ライブラリを喜んで報告し、boostlib_system-vc100-mt-gd-1_51.lib (ライブラリ ビルドと実行可能ファイルの両方) が含まれています。

1>  MyModule.cpp
1>  Linking to lib file: libboost_thread-vc100-mt-sgd-1_51.lib
1>  Linking to lib file: libboost_date_time-vc100-mt-sgd-1_51.lib
1>  Linking to lib file: libboost_system-vc100-mt-sgd-1_51.lib
1>  Linking to lib file: libboost_chrono-vc100-mt-sgd-1_51.lib

DLL リンケージを要求しているプロジェクト構成のどこにも表示されません。

ランタイム ライブラリの選択を確認しました (マルチスレッド デバッグ、静的にリンク)。私は静的ライブラリで MFC を使用しており、すべてのブースト ライブラリが利用可能です (そして、どこにも BOOST_DYNAMIC_etc フラグを宣言していません)。

他にどこで設定を台無しにしたのか、またはこれらのライブラリを使用して静的リンクを排除する問題があるかどうか (または少なくとも LNK4049 警告を生成せずに) を考えるのに苦労しています。

何か案は?

両方のプロジェクトでのコンパイラ/リンカーのコマンド ライン オプションを次に示します。

アプリケーション コンパイラ:

/ZI /nologo /W3 /WX- /Od /Oy- /D "BOOST_LIB_DIAGNOSTIC" /D "_GUICON" /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Yu"StdAfx.h" /Fp"Debug_Static\MyApp.pch" /Fa"Debug_Static\" /Fo"Debug_Static\" /Fd"Debug_Static\vc100.pdb" /FR"Debug_Static\" /Gd /analyze- /errorReport:queue

アプリケーション リンカー:

/OUT:"C:\VSPRJ10\MyApp\Debug_Static\MyApp.exe" /VERBOSE:Lib /INCREMENTAL:NO /NOLOGO /LTCG:STATUS "MyLib.lib" "setupapi.lib" /NODEFAULTLIB:"MSVCRTD.lib" /NODEFAULTLIB:"msvcprtd.lib" /NODEFAULTLIB:"boost_system-vc100-mt-gd-1_51.lib" /MANIFEST /ManifestFile:"Debug_Static\MyApp.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\VSPRJ10\MyApp\Debug_Static\MyApp.pdb" /MAP /MAPINFO:EXPORTS /SUBSYSTEM:WINDOWS /PGD:"C:\VSPRJ10\MyApp\Debug_Static\MyApp.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE 

ライブラリ コンパイラ:

/ZI /nologo /W3 /WX- /Od /Oy- /D "_WIN32_WINNT=0x0501" /D "BOOST_LIB_DIAGNOSTIC" /D "WIN32" /D "_DEBUG" /D "_LIB" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug_Static\MyLib.pch" /Fa"Debug_Static\" /Fo"Debug_Static\" /Fd"Debug_Static\vc100.pdb" /Gd /analyze- /errorReport:queue 

ライブラリアン:

/OUT:"C:\VSPRJ10\MyApp\Debug_Static\MyLib.lib" /NOLOGO /VERBOSE 
4

0 に答える 0