Визуальное студийное предупреждение компоновщика LNK4098
У меня есть проект DLL, в котором, когда в конфигурации выпуска я строю проект, я получаю следующее предупреждение:
MSVCRT.lib (cinitexe.obj): предупреждение LNK4098: defaultlib 'msvcrtd.lib' конфликтует с использованием других библиотек; использовать /NODEFAULTLIB: библиотека
Это всего лишь предупреждение, но я не знаю, следует ли это учитывать.
Насколько я понял, они являются многопоточными библиотеками, нормальной и отладочной версиями. Моя dll использует многопоточность, и я могу отлаживать ее, хотя я использую для нее boost: thread, поэтому я действительно не знаю, нужна ли мне эта библиотека для Windows для отладки или сборки релиза...
С наилучшими пожеланиями, Алекс
Что ж, я сделал, как предложил BuschnicK, и, используя флаг компоновщика /VERBOSE:LIB, обнаружил, что я ссылаюсь на эти библиотеки в конфигурации отладки:
boost_filesystem-vc100-mt-gd-1_44.lib: libboost_system-vc100-mt-gd-1_44.lib: libboost_thread-vc100-mt-gd-1_44.lib: libboost_date_time-vc100-mt-gdb-1_44.
У меня было то же самое в Конфигурации выпуска, главным образом потому, что я не указал тогда "явно". Таким образом, я изменил их на это в Release:
boost_filesystem-vc100-mt-1_44.lib: libboost_system-vc100-mt-1_44.lib: libboost_thread-vc100-mt-1_44.lib: libboost_date_time-vc100-mt-1_44.lib:
Похоже, это сработало, но я все еще получал первое предупреждение, пока не понял, что у меня тоже есть определение препроцессора _DEBUG в моей конфигурации выпуска, удалил его, и теперь оно работает хорошо.
Спасибо всем за помощь!!
2 ответа
Похоже, что вы можете запускать отладочную библиотеку и откомпилированную библиотеку выпуска в одной сборке.
Просмотрите параметры проекта и выберите использование отладочных версий любых сторонних библиотек, которые вы используете.
В сообщении говорится, в чем проблема, если внимательно прочитать: "MSVCRT.lib" против "msvcrtd.lib"
Обратите внимание на добавленное "d" во втором имени библиотеки. Что происходит, так это то, что вы статически подключаетесь к среде исполнения Visual Studio C++ (MSVCRT). Одна из ваших библиотек извлекает версию релиза этой библиотеки, а другая - отладочную версию (отсюда и постфикс "d"). Линкер сообщает вам, что обе библиотеки определяют функции с одинаковыми именами, конфликтуют, и поэтому одна из них автоматически отбрасывается.
Чтобы это исправить, просмотрите параметры сборки всех ваших проектов / библиотек и убедитесь, что они используют одни и те же библиотеки времени выполнения для всех конфигураций сборки. Смотреть в project properties
-> C/C++
-> Code Generation
-> Runtime Library
, Вероятно, следует читать "многопоточные" для сборок релизов и "многопоточные отладки" для сборок отладки.
Обратите внимание, что обычно считается плохой практикой статически связывать эти библиотеки и что вам следует отдавать предпочтение динамически связанным версиям dll.