Несколько проектов с несколькими (разными) конфигурациями сборки в одном решении - PullRequest
4 голосов
/ 01 июня 2010

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

Ответы [ 2 ]

3 голосов
/ 01 июня 2010

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

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

0 голосов
/ 25 июня 2010

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

Проект A (DLL)

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

Проект B (LIB)

  • Конфигурация "DebugStatic" - Debug, Static CRT -> MYLIBDS.LIB
  • Конфигурация "ReleaseStatic" - Release, Статическая ЭЛТ -> MYLIBS.LIB
  • "DebugDynamic" - Debug, DLL CRT -> MYLIBD.LIB
  • "ReleaseDynamic" - Release, 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
...