Свод правил для смешивания /MD и /MT

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

(1) Независимо от того, построено ли ваше приложение с /MT или /MD, вы можете статически связать библиотеку с /MT, даже если она была создана с другой версией среды выполнения C/C++.

(2) Независимо от того, создано ли ваше приложение с /MT или /MD, вы можете динамически связывать (т.е. связывать с библиотекой импорта заглушки DLL) любую библиотеку DLL, даже если она была построена с другой версией среда выполнения C/C++.

(3a) Если ваше приложение построено с /MT, вы не можете статически связываться с библиотекой, созданной с / MD.

(3b) Если ваше приложение создано с /MD, вы можете статически связать библиотеку с /MD, только если она была связана с той же версией MSVCRT, что и ваше приложение.

(4) В любом случае, когда задействованы разные версии среды выполнения C/C++, вы должны быть осторожны, чтобы не использовать структуры данных, выделенные одной версией библиотеки, в функциях другой версии библиотеки.


Мои рассуждения:

(1) Когда вы статически связываетесь с библиотекой, созданной с /MT, эта библиотека встраивает свою собственную копию исполняемых функций C/C++, в которой она нуждается. Таким образом, вы можете встраивать весь этот код в свой код, и он вызывает свои собственные среды выполнения C/C++ и другие функции по мере необходимости, независимо от того, что происходит с библиотекой времени выполнения C/C++ вашего собственного приложения.

(2) Когда вы связываетесь динамически, вы не делаете предположений о том, что делает связанная DLL.

(3a) Статическое связывание приложения /MT с библиотекой / MD не имеет смысла, потому что, связывая приложение /MT, вы говорите, что все вызовы времени выполнения C/C++ разрешаются путем вызова функции, встроенной в ваше приложение. Но библиотека /MD, чей код вы также встраиваете в свое приложение через статическое связывание, говорит, что хочет разрешить те же самые вызовы времени выполнения C/C++, вызывая DLL. (Я действительно не уверен в своих рассуждениях здесь.)

(3b) Если ваше приложение уже обращается к DLL для вызовов времени выполнения C/C++, вы можете встроить код из библиотеки, которая также вызывает DLL для этих вызовов времени выполнения C/C++, но они должны договориться о том, какая версия они звонят.

(4) Например, если вы вызываете библиотеку, которая возвращает FILE* вашему приложению, а затем используете этот FILE* в своем приложении или передаете его в другую библиотеку, если первая библиотека использует версию A C/C++ времени выполнения и ваше приложение или Во второй библиотеке используется среда выполнения версии B, у нас возникают проблемы, если две версии отличаются в структуре FILE. Другая проблема заключалась в том, чтобы одна библиотека выделяла память в своем пространстве кучи и передавала этот дескриптор другой библиотеке.

0 ответов

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