Предупреждение компоновщика Visual Studio C ++: LNK4006 с C Run-Time (CRT) - PullRequest
3 голосов
/ 21 ноября 2010

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

Так много для заявлений об отказе от ответственности - этот посвящен всем вам, новичкам там:

Я пойду на проект MFCв VS 2010, и мне нужно было добавить стороннюю статическую библиотеку.Все прошло хорошо, оба проекта скомпилированы, и мой проект смог сослаться на библиотеку.Затем, когда я включил заголовочный файл из библиотеки в свой проект, я получил множество предупреждений компоновщика о функциях в библиотеке времени выполнения C, например:

Предупреждение 9, предупреждение LNK4006: _sprintf ужеопределено в libcmtd.lib (sprintf.obj);второе определение игнорируется C: path \ to \ my \ project \ MSVCRTD.lib (MSVCR100D.dll)

Думая «какого черта», я пытался запустить свой проект, и он действительно работал, пока оннаткнулся на строку кода, которая пыталась записать в какой-то файл с помощью «fostream», а затем он рухнул с каким-то страшным исключением из-за повреждения кучи.

При поиске SO я обнаружил некоторые связанные проблемы, ни одна из которых точно не соответствуетпроблема:

Я почти обернул внешнюю библиотеку в dll, прежде чем наткнулся на ответ.

1 Ответ

5 голосов
/ 21 ноября 2010

Мой счастливый конец в том, что я наткнулся на правильный ответ в статье поддержки Microsoft: Как связать с правильной библиотекой C Run-Time (CRT) .

Очевидно, я нарушил следующее правило, как указано в articel:

Библиотека многократного использования и все ее пользователи должны использовать одни и те же типы библиотек CRT и, следовательно, один и тот же переключатель компилятора.

Это означает, что я должен был использовать одну и ту же библиотеку времени выполнения C (CRT) как для проекта, так и для сторонней библиотеки. Выбор CRT в VS 2010 может быть выполнен:щелкните правой кнопкой мыши имя_проекта -> свойства (откроется окно свойств) -> C / C ++ -> Генерация кода -> Библиотека времени выполнения.Используйте раскрывающийся список и выберите библиотеку времени выполнения в соответствии с таблицей в статье (однопоточный, статический многопоточный или многопоточный dll, выпуск или отладка).

После настройки всех проектов,перекомпилируйте их, и (надеюсь) предупреждения исчезли.

...