При построении DLL; на какой тип ЭЛТ я должен ссылаться? - PullRequest
4 голосов
/ 10 марта 2011

в окнах; Есть 2 варианта для связи с ЭЛТ:

  1. Многопоточная, статическая ссылка
  2. Многопоточная, динамическая связь

Может ли кто-нибудь пролить свет на то, что здесь лучше всего делать? Должен ли я связать «статически» с ЭЛТ или создать динамическую ссылку?

Если я создаю динамическую ссылку и пишу программу, в которой используется моя DLL + еще одна сторонняя DLL (которая создает статическую ссылку на CRT), это проблема?

1 Ответ

4 голосов
/ 10 марта 2011

Это большая сделка, когда вы используете DLL в своем приложении. очень важно, чтобы EXE и DLL использовали один и тот же распределитель памяти. В случае, если вы возвращаете указатели или объекты C ++ (например, std :: string) из функции DLL, которая должна быть освобождена вызывающей стороной. Чтобы получить один и тот же распределитель, все модули должны использовать один и тот же экземпляр CRT. Вы получите это, только если вы скомпилируете с / MD, чтобы выбрать версию DLL CRT. И все они должны использовать одну и ту же версию CRT. В любом случае, использование / MT очень трудно диагностировать утечки памяти - нарушение доступа, если вам повезет.

Использование / MT упрощает развертывание приложения, поскольку вам не нужно устанавливать библиотеки DLL времени выполнения. Подразумевается, что это безопасно сделать, только если вам нужно только развернуть EXE. Или когда вы очень тщательно контролируете публичный интерфейс ваших DLL. Например, COM-сервер, совместимый с автоматизацией, может ссылаться на статическую версию CRT. Автоматизация имеет строгие правила обмена указателями и управления памятью.

...