簡體   English   中英

在預構建事件中設置環境變量並在編譯步驟中使用

[英]Setting environment variables in pre-build event and using in compilation step

在 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,並在名為dependencies的項目源的子目錄中設置svn:externals屬性,這樣項目的檢出將額外檢出<svn_path>\\libraries\\my_lib_v1.0.0並將其稱為dependencies\\my_lib工作副本。 然后項目設置可以引用dependencies\\my_lib\\include等。 升級到my_lib 1.0.1 版只需編輯svn:externals屬性——不需要更改代碼和項目設置。

我必須承認,我從未嘗試在預構建步驟中設置環境變量,我可以理解為什么它不一定有效(運行批處理文件很可能會觸發一個單獨的過程,而您想要操縱父進程的環境)。

我一直在使用的一種解決方法是創建一個批處理文件,該文件設置必要的環境變量,然后使用適當的解決方案文件啟動 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

這比最初提出這個問題的時間晚了 11 年。 我正在使用 VS 2019

如果你想在你的事件中分配變量,比如......

設置 ABC=123

然后你不能使用 $(ABC) 因為 $(ABC) 在它被傳遞到命令行運行之前被處理。

您必須使用命令行使用的 %ABC%。 它不知道 $(ABC) 是什么,因為它只能被 Visual Studio 理解。

為了進一步復雜化,visual studio 事件編輯器使用 % 作為轉義字符。 我注意到從 %D 開始的事情很糟糕,%K、%Z 和 %K 是好的。

顯然,您可以使用 %25 作為 % 的轉義符。

%DESTDIR% 不會因為轉義亂碼 - 因此將其更改為 %25DESDIR%25 修復它。

使用 SET 命令設置的環境變量是臨時的,並且僅在設置它們的進程的生命周期內有效。 它們在進程到期時立即到期 - 其他進程無法看到。

Visual Studio 預生成事件是一個單獨的過程。 一旦該過程到期,該環境變量就不再存在。

您確定環境變量是您想要的嗎? 您可以通過在保存在中央網絡位置的文本文件中設置一個值來做到這一點嗎?

編輯:如果您真的想在 Windows 中持續更改環境變量,您可以這樣做,但這將涉及調用某些 Windows API 而不僅僅是調用 SET。 例如http://code.activestate.com/recipes/416087/

嘗試谷歌搜索環境變量窗口持久化

您可能想研究這個工具: http : //workspacewhiz.com/SolutionBuildEnvironmentReadme.html

我們一直使用它來管理構建環境中的環境變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM