Управление / Использование библиотек в сборках Debug против сборок Release
Мне любопытно, что все практикуют, когда дело доходит до использования или распространения библиотек для приложения, которое вы пишете.
Прежде всего, при разработке приложения вы связываете отладочную или выпускную версию библиотек? (Когда вы запускаете приложение в режиме отладки)
Затем, когда вы запускаете свое приложение в режиме выпуска непосредственно перед развертыванием, какую сборку библиотек вы используете?
Как вы выполняете переключение между отладочной и выпускной версиями библиотек? Делаете ли вы это вручную, используете ли вы макросы или что-то еще, что вы делаете?
2 ответа
Сначала я определю, какие требования необходимы из библиотеки:
- Debug / Release
- Поддержка юникода
- И так далее..
После этого вы можете создать конфигурации для каждой комбинации, требуемой вами или другими пользователями библиотеки.
При компиляции и компоновке очень важно, чтобы вы хранили эти библиотеки и исполняемый файл в соответствии с используемыми конфигурациями, т.е. не смешивали выпуск и отладку при компоновке. Я знаю, что на платформе Windows/VS это может вызвать незначительные проблемы с памятью, если библиотеки отладки и выпуска смешиваются в исполняемом файле.
Как упомянул Брайан в Visual Studio, лучше всего использовать Configuration Manager для настройки того, как вы хотите, чтобы каждая конфигурация была вам необходима.
Например, наши проекты требуют наличия следующих конфигураций в зависимости от создаваемого исполняемого файла.
- Debug +Unicode
- Debug +ASCII
- Выпуск +Unicode
- Выпуск +ASCII
Пользователи этого конкретного проекта используют Configuration Manager, чтобы сопоставить свои исполняемые требования с доступными конфигурациями проекта.
Что касается использования макросов, то они широко используются при реализации решений времени компиляции для требований, например, для отладки или выпуска версии функции. Если вы используете VS, вы можете просмотреть атрибуты определений препроцессора, чтобы увидеть, как определяются различные макросы, например, _DEBUG _RELEASE, именно так конфигурация контролирует то, что компилируется.
Какую платформу вы используете для компиляции / компоновки ваших проектов?
РЕДАКТИРОВАТЬ: Расширение вашего обновленного комментария..
Если опция Configuration Manager недоступна для вас, я рекомендую использовать следующие свойства из проекта:
- Линкер->Дополнительные каталоги библиотек или Линкер->Ввод
Используйте макрос $(ConfigurationName)
связать с соответствующей конфигурацией библиотеки, например, Debug/Release.
$(ProjectDir)\..\third-party-prj\$(ConfigurationName)\third-party.lib
- Свойство конфигурацииСобытия сборки или Пользовательский шаг сборки
Выполните копию необходимого библиотечного файла (ов) из зависимого проекта до (или после) до начала сборки.
xcopy $(ProjectDir)\..\third-party-prj\$(ConfigurationName)\third-party.dll $(IntDir)
Макрос $(ProjectDir)
будет заменен на местоположение текущего проекта и приведет к выполнению операции относительно текущего проекта. Макрос $(ConfigurationName)
будет заменен на текущую выбранную конфигурацию (по умолчанию Debug
или же Release
), который позволяет копировать правильные элементы в зависимости от того, какая конфигурация создается в данный момент.
Если вы используете обычное соглашение об именах для ваших конфигураций проекта, это поможет, так как вы можете использовать $(ConfigurationName)
макрос, в противном случае вы можете просто использовать фиксированную строку.
Я использую VS. Способ, которым я это делаю, заключается в том, что библиотеки мне нужны через ссылки проекта. Который в основном просто говорит, в какой папке искать конкретную библиотеку во время загрузки проекта. Я разрабатываю свои библиотеки, чтобы они были как можно более независимыми от проекта или для повторного использования. Поэтому они все свои проекты. Итак, из библиотек, которые мне нужны для конкретного проекта, я создаю папку "3rdParty" или "libs" на том же уровне, что и моя папка "src" в моем дереве папок svn. Я склонен использовать только выпущенные библиотеки, но когда я получаю некоторые неизвестные проблемы и хочу переключиться на отладку, я вручную копирую отладочную версию файлов в папку "lib" и перезагружаю проект.
Я не уверен, должен ли я хранить отладочную и выпущенную версии в своем SVN-дереве. Хотя, поскольку они являются собственными проектами, хранить их в дереве SVN другого проекта неправильно. Они могут быть построены снова без помех в любой момент.
А потом я хотел найти способ сделать переключатель более... хм... ну, в принципе, автоматическим, если вы пока, но я не это имел в виду. Просто кажется, что переключение файлов вручную между выпущенным и отладочным не правильно. Может быть, я еще не нашел его, но мне бы хотелось, чтобы это было так: библиотеку stack.dll ищите в "......\3rdParty\" для выпуска и "......\3rdPartyD\"для отладки.
Что-нибудь такое, чего я не знаю. Что ты предлагаешь? Помните, что библиотеки - это внешние проекты. Там встроенные файлы совершенно в другом месте. Фактически, думайте об этом, как о том, что вам нужно проверить другой проект, собрать его и скопировать собранную библиотеку, если вы хотите другую копию. Как бы вы это настроили?