Огромное количество проблем с компоновщиком только при сборке релиза - PullRequest
3 голосов
/ 14 февраля 2010

У кого-нибудь есть идеи по этому поводу? Ошибки компоновщика выходят из моей рулевой рубки, особенно такие, как этот.

Есть ли еще информация, которую я должен включить?

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 ]

8 голосов
/ 14 февраля 2010

Похоже, вы связываете проекты, созданные с различными настройками библиотеки CRT, один с многопоточным, другой с многопоточной отладкой. Отрегулируйте настройки для всех проектов, чтобы использовать тот же вариант библиотеки, и проблема должна исчезнуть!

2 голосов
/ 14 февраля 2010

Обычно вы не пытаетесь использовать LIBCMTD в сборке релиза, это отладочная версия LIBCMT.

Кажется, ваша сборка выпуска пытается связать что-то с отладочной версией. Вероятно, у вас нарушена зависимость в вашей сборке (или вы пропустили сборку чего-либо, чтобы выпустить вручную, если ваш проект обычно собран из частей).

Может показаться, что это freeglut_static.lib, который не был перестроен для розничной торговли. Если это не так, попробуйте удалить все ваших сборочных продуктов (* .obj, * .lib, * .pch, * .pdb), и, конечно, будьте осторожны, чтобы не удалить вещи, которые вы не производите - сторонние библиотеки и т. д. Затем создайте просто release.

0 голосов
/ 15 февраля 2010

Чтобы добавить к другим замечаниям: не используйте «Редактировать и продолжить» /EDITANDCONTINUE в выпусках сборки. Это полезная функция при отладке, поскольку она может сократить время восстановления. Но это достигается упаковкой вашего исполняемого файла в неоптимизированной форме.

Вы получаете предупреждение, потому что опция / OPT: ICF сворачивает идентичные функциональные тела. Это означает, что две функции имеют один и тот же адрес. Очевидно, это означает, что вы не можете редактировать и заменять только один из них.

...