Установка переменных среды в событии перед сборкой и использование на этапе компиляции - PullRequest
11 голосов
/ 07 января 2009

В 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) : fatal error C1083: Cannot open include file: 'my_lib.h'
Project : warning PRJ0018 : The following environment variables were not found:
$(MY_LIB_VERSION)

Я считаю, что переменная окружения, заданная в событии перед сборкой, поэтому не распространяется на этап компиляции, но я, возможно, что-то упускаю.

Как установить переменную окружения в событии перед сборкой и использовать ее на этапе компиляции?

(В качестве альтернативы любые другие разумные способы определения версии библиотеки один раз и использования ее несколько раз для AdditionalIncludeDirectories и AdditionalLibraryDirectories будут также эффективны.)


Обновление : я решил нашу проблему другим способом. Мы используем Subversion и устанавливаем свойство svn:externals в подкаталоге источника проекта с именем dependencies, так что при извлечении из проекта дополнительно извлекается <svn_path>\libraries\my_lib_v1.0.0 и вызывается его dependencies\my_lib в рабочей копии. Тогда настройки проекта могут относиться к dependencies\my_lib\include и тому подобное. Обновление my_lib до версии 1.0.1 - это просто вопрос редактирования свойства svn:externals - код и настройки проекта менять не нужно.

Ответы [ 3 ]

4 голосов
/ 07 января 2009

Возможно, вы захотите исследовать этот инструмент: http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html

Мы постоянно используем его для управления переменными среды в нашей среде сборки.

4 голосов
/ 07 января 2009

Я должен признать, что я никогда не пытался установить переменные окружения на этапе предварительной сборки, и я понимаю, почему это не обязательно будет работать (запуск командного файла, скорее всего, вызовет отдельный процесс, тогда как вы ' я хочу манипулировать окружением родительского процесса).

Обходной путь, который я использовал, но который будет работать только тогда, когда вы сможете определить необходимые параметры перед запуском 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 голосов
/ 07 января 2009

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

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

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

РЕДАКТИРОВАТЬ : Если вы действительно хотите постоянно изменять переменные среды в Windows, вы можете сделать это, но это будет включать вызов некоторых API-интерфейсов Windows, а не просто вызов SET. Например. http://code.activestate.com/recipes/416087/

Попробуйте поискать Окна переменных среды сохраняются

...