LNK4098 — Насколько это опасно?

Я использую сторонний .lib файл в своем проекте. В то время как наш проект работает хорошо и, кажется, работает хорошо, я получаю это предупреждение от компоновщика:

LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library

Мой проект — это DLL, в которой используется многопоточная DLL Runtime Library (опция / MD). У нас нет другой версии файла .lib, на который мы можем ссылаться.

  • Насколько опасно это предупреждение?
  • Каковы возможные результаты?
  • Наш проект хорошо работает в нашем офисе, если мы ожидаем неожиданных сбоев
    в реальной жизни?

1

Решение

Если он собирается правильно, у вас все в порядке.

Опасность в том, что libcmt определяет некоторые функции, которые также определяются другой библиотекой, которую вы используете. В этом случае вы получите ошибки (во время ссылки), говорящие о том, что символ определен многократно. Если он собирается без ошибок, то получающийся исполняемый файл должен быть в порядке.

1

Другие решения

«LIBCMT» — многопоточная библиотека времени выполнения C от Microsoft. Компилятор Microsoft добавляет информацию в создаваемые им объектные файлы, чтобы компоновщик узнал, с какой версией библиотеки времени выполнения компилятор решил связать. Это предупреждение означает, что информация в двух или более объектных файлах указывает на разные версии библиотеки времени выполнения. Это проблема, и совет, который дает вам предупреждение, чтобы отключить опции DEFAULTLIB действительно плохо. Вместо этого выясните, откуда возник конфликт, и исправьте его. Я не использовал инструменты MS в течение нескольких лет, поэтому я не могу дать вам подробную информацию о том, что инструмент делает, но есть инструмент, который выводит информацию из объектных файлов (возможно, objdump?), и с правильными параметрами, которые предоставят вам библиотечную информацию, которая встроена в каждый объектный файл. Это, в свою очередь, указывает на объектный файл, который вызывает проблему. Затем вы должны выяснить, почему он думает, что ему нужна эта версия; обычно это результат параметров компилятора, которые использовались при его компиляции. Так, например, если один объектный файл был построен как многопоточный, а другой был построен как однопоточный, вы получите конфликт, подобный этому. Вы не можете игнорировать это; если приложение использует несколько потоков и компоновщик извлекается из однопоточной библиотеки вместо многопоточной библиотеки, вы получите загадочные сбои в функциях, которые не синхронизированы должным образом.

2

По вопросам рекламы [email protected]