визуальное студийное предупреждение компоновщика LNK4098 - PullRequest
5 голосов
/ 02 декабря 2010

У меня есть проект DLL, в котором, когда в конфигурации выпуска я строю проект, я получаю следующее предупреждение:

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

Это просто предупреждение, но я не знаю, следует ли это учитывать.

Насколько я понял, они являются многопоточными библиотеками, нормальной и отладочной версиями. Моя dll использует многопоточность, и я могу отлаживать ее, хотя я использую для нее boost: thread, поэтому я действительно не знаю, нужна ли мне эта библиотека для Windows для отладки или сборки релиза ...

С уважением, Alex

Что ж, я сделал так, как предложил BuschnicK, и, используя флаг компоновщика / VERBOSE: LIB, обнаружил, что я ссылаюсь на эти библиотеки в конфигурации отладки:

boost_filesystem-VC100-мт-Г.Д.-1_44.lib: libboost_system-VC100-мт-Г.Д.-1_44.lib: libboost_thread-VC100-мт-Г.Д.-1_44.lib: libboost_date_time-VC100-мт-Г.Д.-1_44.lib:

У меня было то же самое в Конфигурации выпуска, главным образом потому, что я не указал тогда "явно". Таким образом, я изменил их на это в Release:

boost_filesystem-VC100-мт-1_44.lib: libboost_system-VC100-мт-1_44.lib: libboost_thread-VC100-мт-1_44.lib: libboost_date_time-VC100-т-1_44.lib:

Кажется, это сработало, но я все еще получал первое предупреждение, пока не понял, что у меня есть определение препроцессора _DEBUG в моей конфигурации релиза, удалил его, и теперь оно работает нормально.

Спасибо всем за помощь !!

Ответы [ 2 ]

10 голосов
/ 02 декабря 2010

В сообщении говорится, в чем проблема, если внимательно прочитать: «MSVCRT.lib» против «msvcrtd.lib»

Обратите внимание на добавленный «d» во втором имени библиотеки.Происходит то, что вы статически подключаетесь к среде исполнения Visual Studio C ++ (MSVCRT).Одна из ваших библиотек извлекает версию выпуска этой библиотеки, а другая - отладочную версию (отсюда и постфикс "d").Линкер говорит вам, что обе библиотеки определяют функции с одинаковыми именами, конфликтуют, и поэтому одна из них автоматически отбрасывается.

Чтобы исправить это, пройдите настройки сборки всех ваших проектов / библиотек и убедитесь, что они используют одни и те же библиотеки времени выполнения для всех конфигураций сборки.Посмотрите в project properties -> C/C++ -> Code Generation -> Runtime Library.Вероятно, следует читать «многопоточные» для сборок релизов и «многопоточные отладки» для сборок отладки.

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

7 голосов
/ 02 декабря 2010

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

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

...