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





Вам не нужно использовать настраиваемый распределитель, если вы используете C++, и вы обертываете все выделения вокруг std::tr1::shared_ptr (где вы можете указать функцию освобождения). Это гарантирует, что даже когда клиенты освобождают последнюю ссылку на общий указатель, он по-прежнему кодирует в вашей библиотеке (или CRT вашей библиотеки), который вызывается, когда объект должен быть освобожден.
Это один из способов решить проблему «ада границ DLL». Надеюсь, это поможет! :-)
Обновлено: я думаю, что неправильно понял смысл вашего вопроса. Вместо того, чтобы отказываться от какой-либо зависимости от CRT, потому что вы беспокоитесь о граничном аду DLL, я полагаю, вам просто нужна версия вашей DLL, которую вы можете установить где угодно. В этом случае вы можете сделать свою программу ссылкой на msvcrt.dll. Это доступно в любой системе Windows.
Вы не слышали об этом от меня, но, видимо, в комплекте разработки драйверов вы можете найти какую-то библиотеку импорта, которая позволяет более новым версиям Visual Studio связываться с msvcrt.
Статическая ссылка на библиотеку времени выполнения C++:
Это не помогает сделать его совместимым с несколькими версиями MSVC.
В качестве общего ответа вам нужна статическая ссылка.
Краткое примечание к ответу Криса (не хочу снижать усиление, потому что это в основном хорошо, но ...):
НЕ ссылайтесь на msvcrt.dll (неверсированный); это DLL версии для конкретной ОС, и если вы установите ссылку на нее, ваше приложение, вероятно, не будет работать в других версиях Windows. Насколько мне известно, вы всегда должны ссылаться на msvcrt ##. Dll. DDK может содержать для него библиотеку, но не связывайтесь с ней, если вы действительно не знаете, что делаете.
Я повысил ваш ответ. Обычно вы не хотите использовать msvcrt.dll, а подход DDK недокументирован и не поддерживается, насколько мне известно. Отсюда «вы не слышали этого от меня». :-)
Я согласен с твоей точкой зрения. Я не буду редактировать свой пост, в основном для потомков, однако я повысил ваш пост, и другим читателям тоже стоит его прочитать. :-)