Несколько проектов с несколькими (разными) конфигурациями сборки в одном решении

Что является правильным и простым пошаговым способом иметь несколько конфигураций сборки в одном проекте VS, где Решение также содержит несколько проектов? Проекты будут иметь разные конфигурации сборки. По сути, я ищу что-то вроде проекта A с Dll Debug, Dll Release, Static (библиотека) Debug и Static (библиотека) Release, проект B с Debug & Release, который создает.exe.

2 ответа

Это не так, как это работает. Если вы дадите библиотеке возможность либо статически связать CRT, либо использовать версию CRT для DLL, вам придется использовать эту же опцию и в проекте EXE. Смешивание параметров обычно приводит к множеству ошибок компоновщика. Даже если вам удастся избежать их, катастрофа произойдет во время выполнения, когда функции из.lib используют распределитель памяти, отличный от функций в EXE.

Использование подхода "все из них" не имеет большого смысла. Если вы знаете, что вы будете использовать только статические библиотеки и создавать монолитный двоичный объект EXE, тогда имеет смысл использовать статическую версию CRT. Облегчает развертывание вашей программы. Если вы когда-нибудь задумываетесь об использовании DLL, то имеет смысл только версия DLL CRT.

Самый простой способ добиться этого - создать несколько проектов, в которых собраны одни и те же источники. У вас могут быть проекты для каждого случая, который вы хотите (DLL, Static Lib). Затем вы можете иметь несколько конфигураций для этих проектов, чтобы они могли генерировать несколько вариантов.

Проект А (DLL)

  • Конфигурация "DebugStatic" - отладка, статическая CRT -> MYLIBDS.DLL
  • Конфигурация "ReleaseStatic" - релиз, статическая CRT -> MYLIBS.DLL
  • "DebugDynamic" - Отладка, DLL CRT -> MYLIBD.DLL
  • "ReleaseDynamic" - Выпуск, DLL CRT -> MYLIB.DLL

Проект B (LIB)

  • Конфигурация "DebugStatic" - Отладка, Статический CRT -> MYLIBDS.LIB
  • Конфигурация "ReleaseStatic" - релиз, статический CRT -> MYLIBS.LIB
  • "DebugDynamic" - Отладка, DLL CRT -> MYLIBD.LIB
  • "ReleaseDynamic" - Выпуск, DLL CRT -> MYLIB.LIB

Вы можете использовать один и тот же подход для генерации отдельных двоичных файлов для Ansi против Unicode, x86 против x64, однопоточных или многопоточных и т. Д. Каждый проект включает в себя один и тот же набор исходных файлов с условными кодами блоков по мере необходимости. Затем вы можете добавить что-то подобное в заголовочный файл, связанный с библиотекой, чтобы упростить компоновку в соответствующей версии:

#ifdef _DEBUG
  #ifdef _DLL
    #pragma comment(lib, "MYLIBD.LIB")
  #else
    #pragma comment(lib, "MYLIBDS.LIB")
  #endif
#else
  #ifdef _DLL
    #pragma comment(lib, "MYLIB.LIB")
  #else
    #pragma comment(lib, "MYLIBS.LIB")
  #endif
#endif
Другие вопросы по тегам