我有一个静态链接到我写的库的MFC应用程序,我也在两个项目中都使用了boost(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库都可用(我没有在任何地方声明BOOST_DYNAMIC_etc标志)。
我只是努力想还有什么地方我可能会搞砸的配置,还是有一些gotchya使用这些库,排除静态链接(或至少不产生这些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