Установка переменных среды в событии предварительной сборки и использование на этапе компиляции

В 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 - не нужно было изменять параметры кода и проекта.

Ответ 2

Я должен признать, что я никогда не пытался устанавливать переменные среды на этапе предварительной сборки, и я могу понять, почему это не обязательно будет работать (запуск командного файла, скорее всего, вызовет отдельный процесс, 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

Ответ 3

Переменные окружения, заданные с помощью команды SET, являются временными и только для продолжительности жизни процесса, в котором они установлены. Они сразу же истекают, когда процесс истекает, и не могут быть замечены другими процессами.

Событие предварительной сборки Visual Studio - это отдельный процесс. По истечении этого процесса эта переменная среды перестает быть.

Вы уверены, что переменные окружения - это то, что вы хотите? Не могли бы вы сделать это, установив значение в текстовом файле, хранящемся в центральном сетевом расположении?

EDIT: Если вы действительно хотите постоянно изменять переменные среды в Windows, вы можете это сделать, но это будет связано с вызовом в некоторые API Windows, а не просто вызовом SET. Например. http://code.activestate.com/recipes/416087/

Попробуйте googling сохраняемые переменные переменных среды