Visual studio - 防止静态库链接

3
我正在Visual Studio 2010中创建一个静态库。该库将与我的另一个应用程序进行静态链接以生成.exe文件。问题是我希望我的.exe文件静态链接到C和C ++库(不想依赖于msvcp100.dll和msvcr100.dll)。但是,无论我做什么,都无法使其工作。
如果我将我的静态库与静态的C和C ++库链接起来,那么我就无法编译.exe文件 - 链接器会抱怨“已定义的符号”。
如果我将我的静态库与C和C ++ DLL链接,则我的.exe文件最终会依赖于msvcp100.dll和msvcr100.dll。
我该如何告诉VS只在链接到我的.exe文件时才将我的静态库与静态的C和C ++库链接起来?
编辑
以下是当静态库和.exe用户/ MT(即运行时库的静态链接)时的一些自由链接器错误:
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in re2_release.lib(regexp.obj)
1>msvcprt.lib(MSVCP100.dll) : error LNK2005: "protected: virtual class std::basic_streambuf<char,struct std::char_traits<char> > * __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::setbuf(char *,__int64)" (?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEPAV12@PAD_J@Z) already defined in re2_release.lib(regexp.obj)
1>msvcrt.lib(MSVCR100.dll) : error LNK2005: _strtoul already defined in LIBCMT.lib(strtol.obj)
1>LIBCMT.lib(crt0init.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

如果我设置/NODEFAULTLIB:LIBCMT,则mscvrt.lib的错误消失,但msvcprt.lib的错误仍然存在。

你的EXE项目设置必须与库项目设置相匹配。 - Hans Passant
这样做会导致链接器出现“已定义”错误。静态库和.exe使用静态C运行时链接,大部分其他设置也相同。 - c0ldcrow
请不要让我们猜测链接器错误消息,请发布前几个消息。 - Hans Passant
1
某些模块没有使用运行时库的静态链接,因为您的链接器错误显示“msvcrt.lib”,这是DLL版本的导入库。请仔细查看您的项目设置和任何其他链接的库,确保所有内容都使用/MT。 - librik
@librik,你应该对你的评论做出回答。我和OP遇到了同样的问题。根据你的建议,我检查了所有项目的设置,发现主可执行文件使用/MD而库使用/MT。 - Stephane Rolland
1个回答

3

我曾经遇到过这个问题,而librik的解决方案解决了它。以下是他的话,供那些跳过评论的人参考:

某些模块没有使用运行库的静态链接,因为你的链接错误显示“msvcrt.lib”,这是DLL版本的导入库。仔细查看你的项目设置和任何其他你链接到的库,确保所有东西都使用/MT。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接