Несколько проектов с несколькими (разными) конфигурациями сборки в одном решении
Что является правильным и простым пошаговым способом иметь несколько конфигураций сборки в одном проекте 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