свод правил для смешивания / MD и / MT - PullRequest
0 голосов
/ 28 августа 2018

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

(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 * в своем приложении или передаете его в другую библиотеку, если первая библиотека использует C / C ++ исполняющую версию A и ваш Приложение или вторая библиотека используют исполняемую версию B, у нас возникают проблемы, если две версии отличаются в структуре FILE. Другая проблема заключается в том, что одна библиотека выделяет память в своем пространстве кучи и передает этот дескриптор другой библиотеке.

...