繁体   English   中英

是否可以创建一个静态库(单个.lib文件),以后可以用/ MT,/ MTd,/ MD或/ MDd编译?

[英]Is it possible to create a static library (single .lib file) that can be later compiled with either /MT, /MTd, /MD or /MDd?

我想创建一个不指定其对C运行时库(CRT)的依赖的库,而不是创建4个不同的库(一个用于MT,MTd,MD,MDd )。

我试图将“/ c / Zl”选项传递给vc10编译器,然后将/ NODEFAULTLIB传递给lib命令。 后来当我使用这样的lib时,当我用不同于默认/ MT的开关编译我的程序时,我仍然有错误。 例如/ MD这里的第一个错误很少:

msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct st
d::char_traits<char> >::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > & (__cdecl*)(class std::basic_ostream<char,struct std::char_tra
its<char> > &))" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z) already defined in lib.lib(lib.obj)
msvcprt.lib(MSVCP100.dll) : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::endl(class std::basic_ostream<char,stru
ct std::char_traits<char> > &)" (?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z) already defined in lib.lib(lib.obj)

是否可以创建一个静态库(单个.lib文件),以后可以使用/ MT,/ MTd,/ MD或/ MDd在最终程序中编译?

我通常会说/ MT / Zl是制作'中性'lib文件的重要选项。

这里的问题是c ++中存在某种冲突而不是c运行时。 似乎已经决定将一些模板类的实现添加到lib.lib文件中 - 并且可以理解为什么 - 在/ MT构建中你告诉编译器c-runtime dll不能使用公共模板实例化的预编译形式 - 因此STL头文件将选择内置的变体。

可能还有一些其他宏定义控制STL头文件选择如何公开其功能。 在不知道它们是什么的情况下,似乎简单的规则是:如果正在使用STL,则实际上不能创建运行时中立的lib。

一个想法是不使用任何CRT功能。

您可以使用DLL而不是Lib。 DLL形成单独的链接域。 具有不同运行时/编译器的DLL可以很容易地混合使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM