Pergunta

No Visual Studio 2003, estou tentando definir uma variável de ambiente no evento de pré-construção que será usada na etapa de compilação, mas o valor não parece ser propagado.Por exemplo, se o evento de pré-construção contiver isto (diretamente ou em um arquivo em lote):

set MY_LIB_VERSION=1.0.0

e AdicionalIncludeDirectories tem isto:

c:\path\to\library\my_lib_v$(MY_LIB_VERSION)\include

então eu esperaria que a compilação funcionasse se o my_lib_v1.0.0 diretório existe.Mas em vez disso, eu recebo

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)

Deduzo que a variável de ambiente definida no evento de pré-construção, portanto, não está sendo propagada para a etapa de compilação, mas posso estar faltando alguma coisa.

Como posso definir a variável de ambiente no evento de pré-construção e usá-la na etapa de compilação?

(Como alternativa, quaisquer outras maneiras sensatas de definir uma versão de biblioteca uma vez e usá-la várias vezes para AdicionalIncludeDirectories e AdicionalLibraryDirectories funcionariam da mesma forma.)


Atualizar:Acabei resolvendo nosso problema de uma maneira diferente.Estamos usando o Subversion e configuramos o svn:externals propriedade em um subdiretório da origem do projeto chamado dependencies, de modo que uma verificação do projeto também verificaria <svn_path>\libraries\my_lib_v1.0.0 e chamá-lo dependencies\my_lib na cópia de trabalho.Então as configurações do projeto poderiam referir-se a dependencies\my_lib\include e coisas assim.Atualizando para a versão 1.0.1 do my_lib é então simplesmente uma questão de editar o svn:externals propriedade - o código e as configurações do projeto não precisaram ser alterados.

Foi útil?

Solução

Você pode querer investigar esta ferramenta: http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html

Nós o usamos o tempo todo para gerenciar variáveis ​​de ambiente em nosso ambiente de construção.

Outras dicas

Devo admitir que nunca tentei definir variáveis ​​de ambiente em uma etapa de pré-construção e posso ver por que isso não funcionaria necessariamente (a execução de um arquivo em lote provavelmente acionaria um processo separado, enquanto você desejaria manipular o ambiente do processo pai).

Uma solução alternativa que estou usando, mas que só funcionará quando você puder determinar as configurações necessárias antes de iniciar o Visual Studio, é criar um arquivo em lote que defina as variáveis ​​de ambiente necessárias e, em seguida, inicie o Visual Studio com o arquivo de solução apropriado.Reproduzi o esqueleto deste arquivo em lote abaixo:

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

As variáveis ​​de ambiente definidas usando o comando SET são temporárias e duram apenas durante o tempo de vida do processo no qual são definidas.Eles expiram imediatamente quando o processo expira - e não podem ser vistos por outros processos.

Um evento de pré-compilação do Visual Studio é um processo separado.Depois que esse processo expira, essa variável de ambiente deixa de existir.

Tem certeza de que as variáveis ​​de ambiente são o que você deseja?Você poderia fazer isso definindo um valor em um arquivo de texto mantido em um local de rede central?

EDITAR:Se você realmente deseja alterar persistentemente as variáveis ​​de ambiente no Windows, você pode fazê-lo, mas isso envolverá a chamada de algumas APIs do Windows, em vez de apenas chamar SET.Por exemplo. http://code.activestate.com/recipes/416087/

Tente pesquisar no Google janelas de variáveis ​​de ambiente persistindo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top