Создание библиотек Windows C ++ без времени выполнения?
-
06-07-2019 - |
Вопрос
Я пытаюсь создать библиотеку c ++ для использования в Windows / MSVC.
Моя проблема заключается в том, что для правильной связи мне нужно распространять несколько разных версий, связанных с разными версиями сред выполнения c ++ MSVC - одно- и многопоточные, отладка и выпуск, разные версии компилятора, разные другие меры безопасности и другие варианты.
Я хотел бы просто распространять, может быть, два, 32 и 64 бита.
Моя идея состоит в том, чтобы, возможно, использовать другой новый оператор (скажем, mynew) и пользовательские распределители для всех моих типов STL. При создании lib, / nodefaultlib. Затем, при подключении из родительского проекта, потребуйте, чтобы они добавили mynew в new, а мой stl allocator в стандартный (или один из них). Я думаю, мне нужно будет удалить и несколько других функций. Естественно, я бы привел пример реализации с библиотекой, но, надеюсь, это избавит всех от головной боли.
Возможно ли это? Кто-нибудь когда-нибудь пробовал это? Есть ли лучшие практики для создания / распространения библиотек в Windows / MSVC?
Решение
Вы хотите статическую ссылку, как общий ответ.
Краткая заметка об ответе Криса (не хочу преувеличивать, потому что это в основном хорошо, но ...):
НЕ связывайтесь с msvcrt.dll (не версия); это специфичная для ОС версия DLL, и если вы ссылаетесь на нее, ваше приложение, вероятно, не будет работать в других версиях Windows. Насколько я знаю, вы всегда должны ссылаться на msvcrt ##. Dll. DDK может содержать библиотеку для этого, но не ссылаться на нее, если вы действительно не знаете, что делаете.
Другие советы
Статическая ссылка на библиотеку времени выполнения C ++:
<Ол> Вам не нужно использовать пользовательский распределитель, если вы используете C ++, и вы оборачиваете все выделения вокруг std :: tr1 :: shared_ptr
(где вы можете указать функцию освобождения). Это гарантирует, что даже когда клиенты освобождают последнюю ссылку на общий указатель, это все еще код в вашей библиотеке (или CRT вашей библиотеки), который вызывается, когда объект должен быть освобожден.
Это один из способов решения проблемы "ада DLL-границы". Надеюсь, поможет! : -)
Редактировать. Мне кажется, я неправильно понял смысл вашего вопроса. Вместо того, чтобы отказываться от какой-либо зависимости от CRT, потому что вы беспокоитесь о пограничном аде DLL, я полагаю, вы просто хотели версию вашей DLL, которую вы можете установить где угодно. В этом случае вы можете сделать ссылку на свою программу на msvcrt.dll
. Это доступно в любой системе Windows.
Вы не слышали этого от меня, но, по-видимому, в комплекте разработчика драйверов вы можете найти какую-то библиотеку импорта, которая позволяет более новым версиям Visual Studio ссылаться на msvcrt
.