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

В 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/

Попробуй гуглить переменные окружения

Другие вопросы по тегам