Ответ 1
Вы можете изучить этот инструмент: http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html
Мы постоянно используем его для управления переменными среды в нашей среде сборки.
В Visual Studio 2003 я пытаюсь установить переменную среды в событии предварительной сборки, которое затем будет использоваться на этапе компиляции, но значение, похоже, не распространяется. Например, если событие pre-build содержит это (либо непосредственно, либо внутри пакетного файла):
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) : fatal error C1083: Cannot open include file: 'my_lib.h' Project : warning PRJ0018 : The following environment variables were not found: $(MY_LIB_VERSION)
Я выводю, что переменная окружения, установленная в событии предварительной сборки, поэтому не распространяется на этап компиляции, но мне может быть что-то не хватает.
Как установить переменную среды в событии предварительной сборки и использовать ее на этапе компиляции?
(В качестве альтернативы, любые другие разумные способы определения версии библиотеки один раз и использование ее несколько раз для дополнительных файлов и дополнительных библиотек будут делать то же самое.)
Обновление. Я решил решить нашу проблему по-другому. Мы используем 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
- не нужно было изменять параметры кода и проекта.
Вы можете изучить этот инструмент: http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html
Мы постоянно используем его для управления переменными среды в нашей среде сборки.
Я должен признать, что я никогда не пытался устанавливать переменные среды на этапе предварительной сборки, и я могу понять, почему это не обязательно будет работать (запуск командного файла, скорее всего, вызовет отдельный процесс, d хотите манипулировать родительской технологической средой).
Обходной путь, который я использовал, но который будет работать только тогда, когда вы сможете определить необходимые параметры перед запуском 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 - это отдельный процесс. По истечении этого процесса эта переменная среды перестает быть.
Вы уверены, что переменные окружения - это то, что вы хотите? Не могли бы вы сделать это, установив значение в текстовом файле, хранящемся в центральном сетевом расположении?
EDIT: Если вы действительно хотите постоянно изменять переменные среды в Windows, вы можете это сделать, но это будет связано с вызовом в некоторые API Windows, а не просто вызовом SET. Например. http://code.activestate.com/recipes/416087/
Попробуйте googling сохраняемые переменные переменных среды