Когда я пытаюсь создать свои источники, связанные с libeay32.lib. Я создал это локально из источников OpenSSL. Я столкнулся с вышеупомянутым предупреждением "LINK: предупреждение LNK4098: defaultlib" MSVCRT "конфликтует с использованием других libs, используйте /NODEFAULTLIB: library". Когда я отлаживаю свой exe, всякий раз, когда есть какой-то системный вызов (например, read()), Exe падает. После некоторого поиска я мог обнаружить, что это связано с MT-MD и MD. Я не могу это исправить, создав источники openssl по некоторым причинам. На данный момент я сохранил запись "MSVCRT.lib" в Игнорировать специфическую библиотеку. Мне нужно сделать это для нескольких других библиотек. Которого я не хочу. Есть ли другое оптимальное решение.
LINK: предупреждение LNK4098: defaultlib 'MSVCRT' конфликтует с использованием других libs; use/NODEFAULTLIB: библиотека
Ответ 1
Если я правильно понимаю, вы смешиваете версию OpenSSL с отладочной версией своей программы, которая заставляет использовать разные версии CRT, так как вы не опубликовали фактические настройки, может быть еще хуже, что OpenSSL использует DLL CRT, пока ваш код статичен. Укажите, какой тип CRT использует ваша программа (можно найти, нажав Properties
в проекте, а затем Configuration Properties -> C/C++ -> Code Generation -> Runtime Libarary
). Либо используйте надлежащую версию OpenSSL (например, создайте ее с помощью отладочной информации и привяжите ее к отладчику CRT), либо, поскольку вы заявляете, что не можете перекомпилировать OpenSSL, скомпилируйте свой код с Multi-threaded DLL
в версии без оптимизации, чтобы получить программу, которую можно отладить, и использует тот же CRT, что и OpenSSL. Это должно решить его, я думаю.
Ответ 2
Компилятор Visual Studio имеет два режима при создании: многопоточное и не многопоточное. Вы устанавливаете режим при создании проекта и можете изменить его позже в настройках проекта.
Проблема в том, что эти два режима несовместимы. Если вы смешиваете многостраничные и не многопоточные библиотеки, тогда вы получите ошибки, подобные тем, которые у вас есть. Либо перекомпилируйте другую библиотеку в другом режиме, либо измените режим вашего проекта так, чтобы он соответствовал режиму библиотеки.
Ответ 3
Дело в том, что вы привязываете свое приложение к динамической динамике /MD в VS (по умолчанию, это означает, что вы должны предоставить распространяемый пакет Visual Studio с вашим приложением).
Свойства → Свойства конфигурации → C/С++ → Генерация кода → Библиотека времени выполнения
В то время как opensll lib по умолчанию ссылается на runtime статически (среда выполнения содержит, например, реализацию STL). Нехорошо смешивать соединение времени выполнения, таким образом, предупреждение. Вы можете исправить эту проблему, перекомпилировав библиотеку opensll, используя динамическое связывание со средой выполнения.
Обратите внимание: http://developer.covenanteyes.com/building-openssl-for-visual-studio/ то в
мс\nt.mak
измените \MT
на \MD
перед запуском nmake -f ms\nt.mak
и nmake -f ms\nt.mak install
Ответ 4
Этот конфликт возникает при использовании разных вариантов библиотек Microsoft C-Runtime. Вот обзор: http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
Итак, f.e. если вы ссылаетесь на msvcrt.lib(динамический, многопоточный CRT), и одна из ваших зависимостей связана с libcmtd.lib(статическим, многопоточным), это предупреждение появляется. Эта ситуация может привести к незначительным ошибкам и может вызвать все проблемы, которые трудно отлаживать. Существует не так много, чтобы избавиться от предупреждения, чем установить конфликтующую библиотеку в список игнорирования и надеяться на лучшее, если у вас нет контроля над зависимостями. В общем, неплохо использовать ту же связь времени выполнения C/С++ для всех зависимостей и самой программы.