Создание библиотек Windows C ++ без времени выполнения?

StackOverflow https://stackoverflow.com/questions/190059

  •  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 / C ++ | Раздел генерации кода.
  • Установите для библиотеки времени выполнения значение Многопоточный (/ MT).
  • Вам не нужно использовать пользовательский распределитель, если вы используете C ++, и вы оборачиваете все выделения вокруг std :: tr1 :: shared_ptr (где вы можете указать функцию освобождения). Это гарантирует, что даже когда клиенты освобождают последнюю ссылку на общий указатель, это все еще код в вашей библиотеке (или CRT вашей библиотеки), который вызывается, когда объект должен быть освобожден.

    Это один из способов решения проблемы "ада DLL-границы". Надеюсь, поможет! : -)

    Редактировать. Мне кажется, я неправильно понял смысл вашего вопроса. Вместо того, чтобы отказываться от какой-либо зависимости от CRT, потому что вы беспокоитесь о пограничном аде DLL, я полагаю, вы просто хотели версию вашей DLL, которую вы можете установить где угодно. В этом случае вы можете сделать ссылку на свою программу на msvcrt.dll . Это доступно в любой системе Windows.

    Вы не слышали этого от меня, но, по-видимому, в комплекте разработчика драйверов вы можете найти какую-то библиотеку импорта, которая позволяет более новым версиям Visual Studio ссылаться на msvcrt .

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top