Как библиотеки DLL Windows подключаются к среде выполнения MSVC

#visual-studio-2008 #winapi

#visual-studio-2008 #winapi

Вопрос:

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

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

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

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

Комментарии:

1. Это не имеет ничего общего с Win32, и все связано со средой выполнения MSVC. Перечисление ваших ошибок в одном длинном абзаце нам не поможет. Пожалуйста, четко задайте прямой вопрос.

Ответ №1:

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

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

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

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

Комментарии:

1. на самом деле msvcr80 предназначен для VS2005. msvcr90 поставляется с VS2008.

2. Либо приложение, либо проект DLL могут использовать библиотеку времени выполнения, либо статически связанную, либо как DLL. Нет libcmt.dll поскольку статическое связывание не включает отдельную библиотеку DLL. Код в libcmt.lib включается в ваш . EXE или ваша .DLL. Я понимаю, что если я компилирую свою библиотеку как .lib и компилирую ее как _MT, то то, что вы говорите, правильно. Мой вопрос в том, если я компилирую свой проект как dll (мой вывод будет mylib.dll ) и выполните _MT, будет ли по-прежнему libcmt.lib включен в него статически?@ Ben Voigt

3. @Martyn: Ммм, да. Хороший улов.

4. @pjain: Вы процитировали предложение, где я ответил на это. Если вы скомпилируете проект DLL с помощью /MT , код из libcmt.lib будет включен в вашу .DLL. И ваша библиотека DLL имеет свой собственный диспетчер памяти, несовместимый с остальной частью программы, поэтому память, выделенная внутри библиотеки DLL, должна быть освобождена внутри библиотеки DLL, а память, выделенная вне библиотеки DLL, не может быть освобождена внутри библиотеки DLL.

5. да, я понял это после публикации 🙂 . Спасибо за вашу любезную помощь.