Установка переменных среды в событии перед сборкой и использование на этапе компиляции
В Visual Studio 2003 я пытаюсь установить переменную среды в событии перед сборкой, которое затем будет использоваться на этапе компиляции, но значение, похоже, не передается. Например, если событие предварительной сборки содержит это (напрямую или внутри пакетного файла):
set MY_LIB_VERSION=1.0.0
и AdditionalIncludeDirectories имеет это:
c:\path\to\library\my_lib_v$(MY_LIB_VERSION)\include
тогда я ожидаю, что компиляция сработает, если my_lib_v1.0.0
каталог существует. Но вместо этого я получаю
c:\path\to\prog\my_prog.c(22): фатальная ошибка C1083: не удается открыть файл включения: 'my_lib.h' Проект: предупреждение PRJ0018: Следующие переменные среды не найдены: $(MY_LIB_VERSION)
Я сделал вывод, что переменная окружения, заданная в событии перед сборкой, поэтому не распространяется на этап компиляции, но я могу что-то упустить.
Как установить переменную окружения в событии перед сборкой и использовать ее на этапе компиляции?
(В качестве альтернативы, любые другие разумные способы определения версии библиотеки один раз и использования ее несколько раз для AdditionalIncludeDirectories и AdditionalLibraryDirectories также будут полезны.)
Обновление: я решил нашу проблему по-другому. Мы используем Subversion и настраиваем svn:externals
свойство в подкаталоге источника проекта с именем dependencies
так, чтобы оформить заказ на проект дополнительно <svn_path>\libraries\my_lib_v1.0.0
и назовите это dependencies\my_lib
в рабочей копии. Тогда настройки проекта могут относиться к dependencies\my_lib\include
и тому подобное. Обновление до версии 1.0.1 my_lib
тогда просто вопрос редактирования svn:externals
свойство - код и настройки проекта менять не нужно.
3 ответа
Возможно, вы захотите изучить этот инструмент: http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html
Мы постоянно используем его для управления переменными среды в нашей среде сборки.
Это на 11 лет позже, чем первоначально был задан этот вопрос. Я использую VS 2019
если в случае, если вы хотите назначить переменные в своем мероприятии, например....
установить ABC=123
Тогда вы не можете использовать $(ABC), так как $(ABC) обрабатывается до того, как он будет передан в командную строку для запуска.
Вы должны использовать%ABC%, как используется в командной строке. Он не знает, что такое $(ABC), поскольку это понимает только визуальная студия.
Чтобы еще больше усложнить ситуацию, редактор событий Visual Studio использует% в качестве escape-символа. Я заметил, что вещи, начинающиеся с%D, плохие, %K, %Z и% K - хорошие.
По-видимому, вы можете использовать%25 как escape для%.
%DESTDIR% не работает, поскольку экранирование искажает его, поэтому изменение его на%25DESDIR%25 исправляет.
Я должен признать, что я никогда не пытался установить переменные окружения на этапе предварительной сборки, и я понимаю, почему это не обязательно будет работать (запуск командного файла, скорее всего, вызовет отдельный процесс, тогда как вы захотите манипулировать средой родительского процесса).
Обходной путь, который я использовал, но который будет работать только тогда, когда вы сможете определить необходимые параметры перед запуском Visual Studio, - это создать пакетный файл, который устанавливает необходимые переменные среды, а затем запускает Visual Studio с соответствующим файлом решения. Я воспроизвел скелет этого командного файла ниже:
REM
REM Set up VS environment with defaults (this is for 2008) - need to do this first
REM
call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
REM
REM Set the environment variables required by the project
REM
set BOOST_BASE=C:\Boost\include\boost-1_35
REM
REM If you need to manipulate the path, do it here
REM
REM
REM Finally, start VS with the appropriate solution file
REM
devenv MyProjectWithBoost.sln
Переменные среды, которые устанавливаются с помощью команды SET, являются временными и действуют только в течение времени жизни процесса, в котором они установлены. Они сразу же истекают, когда истекает процесс - и не видны другим процессам.
Событие предварительной сборки Visual Studio - это отдельный процесс. Как только этот процесс истекает, эта переменная среды перестает быть.
Вы уверены, что переменные среды - это то, что вам нужно? Не могли бы вы сделать это, установив значение в текстовом файле, хранящемся в центральной сетевой папке?
РЕДАКТИРОВАТЬ: Если вы действительно хотите постоянно изменять переменные среды в Windows, вы можете сделать это, но это будет включать вызов некоторых API-интерфейсов Windows, а не просто вызов SET. Например, http://code.activestate.com/recipes/416087/
Попробуй гуглить переменные окружения