ошибка связи при изменении конфигурации с Debug на Release - PullRequest
10 голосов
/ 03 апреля 2011

Привет, у меня есть проект В VC ++ 2008 этот проект компилируется в режиме отладки без ошибок, но когда я пытаюсь построить его в режиме выпуска, я получаю ниже ссылку erorr.

1>Linking...
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)......

как я могу это исправить?спасибо.

Ответы [ 6 ]

21 голосов
/ 03 апреля 2011

Вы смешиваете среды выполнения VS. Убедитесь, что параметр «Свойства проекта / C ++ / Генерация кода / Библиотека времени выполнения» одинаков для вашего проекта и всех библиотек, на которые вы ссылаетесь.

7 голосов
/ 23 апреля 2014

У меня была такая же проблема, как и у вас. Причиной этой проблемы является то, что Linker включает в себя множество библиотек, которые вы не видите (например, вы включите windows.h , в него входит windef.h и так далее ...) , И поскольку эти файлы не написаны для защиты от идиотов (#ifndef отсутствует), компоновщик будет пытаться #define повторять одно и то же больше раз - проблема.

Мое решение было установить это поле: Свойства проекта -> Компоновщик -> Ввод -> Игнорировать определенную библиотеку

to " libcmt.lib "

При этом ваш компоновщик будет игнорировать также в конфигурации выпуска ту проблемную библиотеку, которая включена по умолчанию и все должно работать ..: -)

Хорошего дня ..: -)

P.S. Если вы хотите избежать этих недоразумений компоновщика, продолжайте настраивать проект не в конфигурации отладки или выпуска, а в «Все конфигурации». Эта опция находится в левом верхнем углу конфигурации проекта.

2 голосов
/ 03 апреля 2011

Вы связываете файл .obj или .lib, который был скомпилирован в конфигурации отладки. Лучше всего убедиться, что файл собран в режиме Release. Во-вторых, лучше всего сказать компоновщику игнорировать запрос на ссылку на libcmtd.lib. Project + Properties, Linker, Input, Ignore Specific Library = libcmtd.lib. Но делайте это только в том случае, если вы не можете получить сборку Release .lib после мощной попытки.

1 голос
/ 11 января 2016

Я столкнулся с подобной проблемой, и все это было связано с тем, что библиотеки, которые вы включаете, собираются с правильным конечным состоянием. Если вы собрали программу в режиме выпуска и указали * .lib файлы, скомпилированные в режиме отладки. это даст вам ошибки совпадения символов. Особенно если ваша программа собирает штрафы в режиме отладки или наоборот.

Возможно, это не совсем ваша проблема, но хорошая информация для кого-то, кто столкнулся с тем же, что и я.

1 голос
/ 01 октября 2014

вы можете удалить определение препроцессора "DEBUG", чтобы решить вашу проблему

0 голосов
/ 03 апреля 2011

Вы, вероятно, определили всю информацию о ссылке в конфигурации «Отладка». Это означает, что вам нужно либо переопределить его для «Release», либо переместить в «All Configurations», чтобы он стал общим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...