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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
2 299
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Я согласен с твоей точкой зрения. Я не буду редактировать свой пост, в основном для потомков, однако я повысил ваш пост, и другим читателям тоже стоит его прочитать. :-)

Chris Jester-Young 10.10.2008 09:55

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

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

Это не помогает сделать его совместимым с несколькими версиями MSVC.

Ben Voigt 07.09.2011 22:13
Ответ принят как подходящий

В качестве общего ответа вам нужна статическая ссылка.

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

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

Я повысил ваш ответ. Обычно вы не хотите использовать msvcrt.dll, а подход DDK недокументирован и не поддерживается, насколько мне известно. Отсюда «вы не слышали этого от меня». :-)

Chris Jester-Young 10.10.2008 09:53

Другие вопросы по теме