#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. да, я понял это после публикации 🙂 . Спасибо за вашу любезную помощь.