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

StackOverflow https://stackoverflow.com/questions/419979

Вопрос

В 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 - это просто вопрос редактирования свойства <=> - код и настройки проекта менять не нужно.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top