1

我有一个 MFC 应用程序,它静态链接到我编写的库,并且在两个项目 (1.51) 中也使用了 boost。

使用动态链接的运行时和提升库(我的库是静态链接的),一切似乎都运行良好。

但是我很想制作一个静态链接的版本,这样我就可以轻松地将 .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 输出愉快地报告了我链接的所有静态 boost 库,它包括 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 标志)。

我只是在努力思考我可能在哪里弄乱了配置,或者是否有一些问题使用这些库来排除静态链接(或者至少不生成那些 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