У меня есть несколько собственных библиотек С++ (Win32, без MFC), которые компилируются в Visual Studio 2005 и используются в ряде решений.
Я хотел бы иметь возможность выбирать, компилировать и связывать их как статические библиотеки или библиотеки DLL, в зависимости от потребностей конкретного решения, в котором я их использую.
Какой лучший способ сделать это? Я рассмотрел эти подходы:
1. Несколько файлов проекта
- Пример: "foo_static.vcproj" vs "foo_dll.vcproj"
- Pro: легко создавать для новых библиотек, не слишком много ручного vcproj munging.
- Con: настройки, списки файлов и т.д. в двух местах слишком легко выходят из синхронизации.
2. Один файл проекта, несколько конфигураций
- Пример: "Debug | Win32" против "Debug DLL | Win32" и т.д.
- Pro: списки файлов легче синхронизировать; варианты компиляции несколько проще синхронизировать.
- Con: Я строю для целей Win32 и Smart Device, поэтому у меня уже есть несколько конфигураций; Я не хочу усиливать мой комбинаторный взрыв ( "Статическая библиотека для FooPhone | WinMobile 6", "Динамическая библиотека для FooPhone | WinMobile 6", "Статическая библиотека для BarPda | WinMobile 6" и т.д.
- Хуже Con: VS 2005 имеет плохую привычку предполагать, что если у вас есть конфигурация, определенная для платформы "Foo", тогда вам это действительно нужно для всех других платформ вашего решения и беспорядочно вставляет все перестановки конфигураций/конфигурации платформы по всем затронутым файлам vcproj, независимо от того, действительны они или нет. (Ошибка, поданная с MS, закрыта как WONTFIX.)
3. Один файл проекта, выбор статического или динамического с помощью файлов vsprops
- Пример: сохраните соответствующие фрагменты vcproj в файлах свойств, затем примените лист свойств "FooApp Static Library" в комбинации конфигурации/платформы, когда вы хотите статические библиотеки, и примените лист свойств "FooApp DLL", когда вам нужны библиотеки DLL.
- Плюсы: Это то, что я действительно хочу сделать!
- Минусы: Это не представляется возможным. Кажется, что .vcproj-атрибут, который переключается между статическими и динамическими библиотеками (атрибут ConfigurationType элемента Configuration), не переопределяется .vsprops файл. Опубликованная схема Microsoft для этих файлов содержит только те элементы <Tool> и <UserMacro> .
EDIT. В случае, если кто-то подскажет это, я также попробовал более "умную" версию №3, в которой я определяю .vsprops, содержащий UserMacro с именем "ModuleConfigurationType" со значением либо "2" (DLL), либо "4" (статическая библиотека), и изменили конфигурацию в .vcproj, чтобы иметь ConfigurationType="$(ModuleConfigurationType)"
. Visual Studio молча и без предупреждения удаляет атрибут и заменяет его ConfigurationType="1"
. Так полезно!
Не хватает ли лучшего решения?