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