Как библиотеки Windows DLL связаны со средой выполнения MSVC - PullRequest
0 голосов
/ 25 мая 2011

хорошо, позвольте мне поставить мой вопрос таким образом. есть два способа, которыми мы можем скомпилировать наши библиотеки в VC ++ (наш тип выходной библиотеки) 1) длл 2) Библиотека

аналогично, есть два способа определить, как добавить дополнительные системные библиотеки (как мы собираем эту библиотеку): 1) использование _MD (это обеспечит связь нашего проекта с msvcrt.dll) 2) использование _MT (это обеспечит связь нашего проекта с libcmt.dll)

Я просто хотел понять, есть ли какая-то связь между «типом нашей выходной библиотеки» и «как мы собираем эту библиотеку». например, если я скомпилирую свою библиотеку как dll, но предоставлю опцию как _MT, будет ли она работать правильно (после компиляции)? и, если да, то какая системная библиотека (будь то msvcrt.dll или libcmt.dll) будет связана с этим. аналогично, если я скомпилирую свою библиотеку как lib (статическую) и предоставлю параметр _MD, будет ли она работать правильно? и если да, то какая системная библиотека (будь то msvcrt.dll или libcmt.dll) будет связана с этим.

Дайте мне знать, если мне все еще не ясен мой вопрос.

1 Ответ

3 голосов
/ 26 мая 2011

Visual C ++ не связал код с MSVCRT.DLL (файл ОС), так как я считаю VC6.

Все версии с тех пор поставляли свои собственные библиотеки времени выполнения C и C ++, отдельно от ОС, например, MSVCRT90.DLL соответствует вашему тегу VC2008.

Приложение или проект DLL могут использовать библиотеку времени выполнения либо статически, либо в виде DLL. Нет libcmt.dll, потому что статическое связывание не включает отдельную DLL. Код в libcmt.lib включается в ваш .EXE или .DLL.

Теперь правильно работать - совсем другое дело. Я не рекомендую использовать dllexport с классами C ++ или освобождать память в модуле, отличном от выделенного, но если ваш код делает то, вы ДОЛЖНЫ использовать /MD и распространять DLL. В противном случае каждый модуль вашего приложения будет иметь отдельную копию библиотеки времени выполнения, чьи объекты и менеджеры памяти не будут взаимозаменяемыми. Причина, по которой я этого не рекомендую, заключается в том, что все модули приложения также должны быть скомпилированы с одинаковой версией и параметрами компилятора ... что действительно воняет, если у вас есть две сторонние библиотеки DLL, а версия компилятора не совпадает между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...