Предупреждение компоновщика C ++ Visual Studio - PullRequest
0 голосов
/ 26 ноября 2010

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

MSVCRT.lib (cinitexe.obj): предупреждение LNK4098: defaultlib 'msvcrtd.lib' конфликтует с использованием других библиотек; использовать / NODEFAULTLIB: библиотека

Я создаю динамическую DLL в Visual Studio C ++ Express Edition . Когда я делаю это в режиме отладки, предупреждение не появляется. Я немного погуглил, и похоже, что msvcrt и msvcrtd оба предназначены для многопоточности, один для отладки, а другой нет. Я мог бы использовать /NODEFAULTLIB с MSVCRT.lib, но я не думаю, что избегание симптомов действительно помогает с проблемой.

Я действительно не знаю, является ли это огромной проблемой. Файлы DLL и .lib сгенерированы правильно.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2010

Проблема связана с вашими библиотеками. Они связаны не так, как ваша программа.

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

Смотрите под

Project Properties 
Configuration Properties
C/C++ 
Code Generation 
Runtime Library

чтобы увидеть настройку (например, "Многопоточная отладочная DLL" (/MDd)").

0 голосов
/ 27 ноября 2010

Проверьте правильность настроек вашей библиотеки времени выполнения в конфигурации выпуска вашего проекта.По сути, он должен быть таким же, как ваша сборка Debug, но без слова «Debug» в описании.Документы Visual Studio по этой проблеме: здесь .

Проверьте настройки следующим образом:

  • в обозревателе решений щелкните правой кнопкой мыши Project и выберите Properties
  • убедитесь, что Конфигурация (в верхней части окна свойств) имеет значение Active (Release)
  • . Перейдите в Свойства конфигурации -> C / C ++ -> Генерация кода
  • , проверьте, что библиотека времени выполнения для выпускане является Debug версией ЭЛТ.
0 голосов
/ 26 ноября 2010

Это огромная проблема, поскольку она может привести ко многим неожиданным сбоям вашего приложения, И вы не можете распространять приложение, которое связывает msvcrtd.lib, так как вам не разрешено распространять среды отладки C ++ Visual Studio. Хотя /NODEFAULTLIB должно исправить это, вы должны решить саму проблему.

Как сказал Касабланка, msvcrtd.lib связан в режиме выпуска, но он должен быть связан только в режиме отладки. Это не означает, что ваше собственное приложение имеет неправильные настройки компоновщика. Любая из библиотек, которые вы используете в своем проекте, также может иметь неправильные настройки.

Обычно я делаю это, чтобы открыть все файлы выпуска .lib, на которые ссылается ваше приложение, с помощью текстового редактора, который может открывать такие большие двоичные файлы (как SciTE ), а затем Я ищу их, например, VC80.DebugCRT (в данном случае VC80 == Visual Studio 2005), и если я найду эту строку в одной из этих библиотек, эта библиотека должна быть перекомпилирована с /MD.

Если вы связываете динамические библиотеки, вы можете использовать инструмент под названием Dependency Walker для файлов .dll вместо ручного поиска в файлах .lib. Если Dependency Walker показывает зависимость от одного из отладочных файлов DLL crt, например, MSVCP80D.dll (обратите внимание на завершающий D), перекомпилируйте эту библиотеку, используя /MD.

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