我想创建一个不指定其对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在最终程序中编译?
答案 0 :(得分:2)
我通常会说/ MT / Zl是制作'中性'lib文件的重要选项。
这里的问题是c ++中存在某种冲突而不是c运行时。似乎已经决定将一些模板类的实现添加到lib.lib文件中 - 并且可以理解为什么 - 在/ MT构建中你告诉编译器c-runtime dll不能使用公共模板实例化的预编译形式 - 因此STL头文件将选择内置的变体。
可能还有一些其他宏定义控制STL头文件选择如何公开其功能。在不知道它们是什么的情况下,似乎简单的规则是:如果正在使用STL,则实际上不能使运行时中立的lib。
答案 1 :(得分:1)
一个想法是不使用任何CRT功能。
答案 2 :(得分:0)
您可以使用DLL而不是Lib。 DLL形成一个单独的链接域。具有不同运行时/编译器的DLL可以轻松混合。