仅限发布版本的大量链接器问题

时间:2010-02-14 00:36:31

标签: c++ opengl linker linker-errors glut

有人对此有所了解吗?链接器错误远远超出了我的驾驶室,特别是像这样的人。

我还应该包含更多信息吗?

1>Linking...
1>freeglut_static.lib(freeglut_window.obj) : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specification
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __heap_alloc already defined in LIBCMT.lib(malloc.obj)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __recalloc already defined in LIBCMT.lib(recalloc.obj)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __msize already defined in LIBCMT.lib(msize.obj)
1>LIBCMTD.lib(malloc.obj) : error LNK2005: _V6_HeapAlloc already defined in LIBCMT.lib(malloc.obj)
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook already defined in LIBCMT.lib(dbghook.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_pHeaderDefer already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_sbh_threshold already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_sbh_threshold already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_amblksiz already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_amblksiz already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_heap_init already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_find_block already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_free_block already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_alloc_block already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_alloc_new_region already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_alloc_new_group already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_resize_block already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_heapmin already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_heap_check already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(isctype.obj) : error LNK2005: __isctype_l already defined in LIBCMT.lib(isctype.obj)
1>LIBCMTD.lib(isctype.obj) : error LNK2005: __isctype already defined in LIBCMT.lib(isctype.obj)
1>LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library

3 个答案:

答案 0 :(得分:8)

您似乎将使用不同CRT库设置构建的项目链接起来,一个使用Multi-Threaded,另一个使用Multi-Threaded Debug。调整所有项目的设置以使用与库完全相同的风格,问题应该消失!

答案 1 :(得分:2)

您通常不会尝试在发布版本中引入LIBCMTD,它是LIBCMT的调试版本。

您的发布版本似乎正在尝试链接到构建调试的内容。您的构建中可能存在破坏的依赖关系(或者,如果您的项目通常是以碎片形式构建的,那么您错过了重建某些东西以便手动发布)。

似乎可能是freeglut_static.lib没有为零售重建。如果不是,那么尝试删除构建产品的所有(* .obj,* .lib,* .pch,* .pdb)当然要小心删除您不生成的内容 - 第三方库等。然后构建只是版本。

答案 2 :(得分:0)

添加到其他备注:不要在发布版本中使用“编辑并继续”/EDITANDCONTINUE。这是调试时的一个有用功能,因为它可以减少重建时间。但它是通过以非优化形式打包您的可执行文件来实现的。

您收到警告,因为/ OPT:ICF选项将折叠相同的函数体。这意味着两个函数共享相同的地址。显然这意味着你不能编辑&只替换其中一个。