Противоречивые библиотеки времени выполнения в проекте Visual C++ DLL

Я только что попытался создать x64 C++ DLL с использованием Visual C++ 2012. Это простая DLL, связывающая один другой статический сторонний.lib файл. Я получаю следующее предупреждение:

предупреждение LNK4098: defaultlib 'LIBCMT' конфликтует с использованием других библиотек; использовать /NODEFAULTLIB: библиотека

Кажется, что другая библиотека использует параметр компоновщика /MT (многопоточная статическая среда выполнения), в то время как моя DLL (и все другие проекты, импортирующие мою DLL) использует /MD (многопоточная среда выполнения DLL). Я не могу согласовать это, поскольку сторонняя библиотека поставляется как есть, и изменение моей DLL создаст такую ​​же проблему во всех проектах, использующих мою DLL.

Я прочитал несколько страниц из MS и форумов об этой проблеме. Но ни одна из этих страниц не объяснила, в чем именно проблема.

Что я не понимаю:

Какой вред связывание кода, который использует другой вариант времени выполнения (кроме траты памяти)? Некоторые люди говорят, что это можно игнорировать, некоторые говорят, что это не так.

Можно ли использовать /NODEFAULTLIB[:library]? В документации говорится, что она "удалит указанную библиотеку или библиотеки из списка библиотек, которые она ищет при разрешении внешних ссылок". Какую библиотеку я должен добавить как ": библиотека" и каким образом это решит проблему?

2 ответа

Решение

Конфликтующие библиотеки времени выполнения могут вызвать серьезные проблемы, если вы совместно используете объекты среды выполнения C (такие элементы, как FILE*) или разделяете выделения памяти (выделяя память в одной части и освобождая ее в другой). Я бы не стал их "соединять", чтобы избежать странных проблем и сбоев.

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

Например, передача типов STL (например, std::string) может привести к серьезным сбоям из-за различий во внутренней структуре объекта и / или в использовании памяти

См. Почему происходит сбой этой программы: передача std::string между DLL

Другие вопросы по тегам