如何在 VS2010 Express 中使静态库独立于发布/调试?

2024-01-29

我正在编写一个应用程序并链接 SDL 和 OpenGL。在我的代码中,我有以下几行:

#pragma comment(lib, "sdl.lib")
#pragma comment(lib, "sdlmain.lib")
#pragma comment(lib, "opengl.lib")

这仅适用于发布模式。在调试模式下,我收到以下链接器错误:

libcmt.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __call_reportfault already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in LIBCMTD.lib(invarg.obj)
libcpmtd.lib(xdebug.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

我已经为我的应用程序从源代码编译了 SDL,因此我可以控制编译器标志。

当我为项目 SDLMain 指定 /NODEFAULTLIB:"LIBCMT.LIB" 或 /NODEFAULTLIB:"LIBCMT" 时,实用程序 dumpbin.exe 在编译 sdlmain.lib 后仍报告以下内容:

Linker Directives
-----------------
/DEFAULTLIB:"LIBCMT"
/DEFAULTLIB:"OLDNAMES"

当我对 opengl.lib(VS2010 Express 附带)使用 dumpbin 时,这些链接器指令不会出现。 opengl.lib 在发布和调试模式下工作。 sdl.lib 可在发布和调试模式下工作,因为我认为它是 DLL 库而不是静态库。

我在这里做错了什么?

EDIT:

我设法通过将 /NODEFAULTLIB:LIBCMT.LIB 添加到我自己的调试配置而不是 SDLMain 来编译和链接它。我还假设 OpenGL 库是一个静态库,但事实并非如此,它也是一个 DLL 库。


在 vs2005 的项目配置中,在链接器选项下,我将“忽略特定库”设置为 libcmt.lib 。 vs2010 配置可能类似。无论如何,请尝试忽略 libcmt.lib 并看看会发生什么。

-- pete

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 VS2010 Express 中使静态库独立于发布/调试? 的相关文章

随机推荐