Сборка Windows C ++ библиотеки без времени выполнения? - PullRequest
4 голосов
/ 10 октября 2008

Я пытаюсь создать библиотеку c ++ для использования в Windows / MSVC.

Моя проблема в том, что для правильной связи мне нужно распространять несколько разных версий, связанных с разными версиями сред выполнения c ++ MSVC - одно- и многопоточные, отладочные и выпуски, разные версии компилятора, разные другие меры безопасности и другие варианты.

Я бы хотел просто раздать, может быть, два, 32 и 64 бита.

Моя идея состоит в том, чтобы, возможно, использовать другой новый оператор (скажем, mynew) и пользовательские распределители для всех моих типов STL. При создании lib, / nodefaultlib. Затем, при подключении из родительского проекта, потребуйте, чтобы они добавили mynew в new, а мой stl allocator в стандартный (или один из них). Я думаю, мне нужно будет удалить и несколько других функций. Естественно, я приведу пример реализации с библиотекой, но, надеюсь, это избавит всех от головной боли.

Возможно ли это? Кто-нибудь когда-нибудь пробовал это? Есть ли лучшие практики для создания / распространения библиотек в Windows / MSVC?

Ответы [ 3 ]

6 голосов
/ 10 октября 2008

Вы хотите статическое связывание, как общий ответ.

Быстрая заметка об ответе Криса (не хочу преувеличивать, потому что это в основном хорошо, но ...):

НЕ ссылаться на msvcrt.dll (неверсионный); это специфичная для ОС версия DLL, и если вы ссылаетесь на нее, ваше приложение, вероятно, не будет работать в других версиях Windows. Насколько я знаю, вы всегда должны ссылаться на msvcrt ##. Dll. DDK может содержать библиотеку для него, но не ссылаться на нее, если вы действительно не знаете, что делаете.

2 голосов
/ 10 октября 2008

Статическая ссылка на библиотеку времени выполнения C ++:

  1. Открыть свойства проекта.
  2. Перейти к свойствам конфигурации | C / C ++ | Раздел генерации кода.
  3. Установить для библиотеки времени выполнения многопоточность (/MT).
0 голосов
/ 10 октября 2008

Вам не нужно использовать пользовательский распределитель, если вы используете C ++, и вы оборачиваете все выделения вокруг std::tr1::shared_ptr (где вы можете указать функцию освобождения). Это гарантирует, что даже когда клиенты освобождают последнюю ссылку на общий указатель, это все еще код в вашей библиотеке (или CRT вашей библиотеки), который вызывается, когда объект должен быть освобожден.

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

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

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

...