- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们有一个正在运行的 Team City Build Server,并且想要编译一个 Visual C++ 项目。到目前为止,这很容易,因为我已经使用 Windows SDK 设置了 Windows Build Agent,但我们没有解决方案/项目文件。
项目文件是使用 CMake 创建的。 CMake 似乎有点笨(未安装 Visual Studio 时无法生成解决方案),但通过一些技巧,我可以让它完成。然后可以使用 MSBuild 构建解决方案。
问题来了。为了使其自动运行,我需要调用 Windows SDK 的 SetEnv.cmd。而且我似乎无法自动找到它。它在 Windows SDK 的 bin 子目录中,但 bin 和 root 都不在路径中,%mssdk%
环境变量由 SetEnv.cmd 设置并且事先不可用!
将 Windows SDK\bin 目录添加到 PATH 会导致 SetEnv.cmd 不再工作(退出时显示一条消息,如 The x86 compilers are not currently installed
和 Jump target Set_x86 not found
。
开始菜单链接正在调用 SetEnv.cmd,并将 Windows SDK 目录作为工作目录。但是,如果我将根目录添加到 PATH,Bin\SetEnv.cmd 将不可用。
如何自动找到 SetEnv.cmd?即使将环境变量设置为 setenv.cmd 的完整路径也不起作用,当我将 %mssdk% 定义为 sdk 目录时,调用 %mssdk%\bin\SetEnv 也不起作用。我还尝试定义 %mssdk%,然后 cd %mssdk%,然后调用 bin\SetEnv。在所有这些情况下也找不到编译器。如果我在命令行上手动 cd 到根目录或 bin 目录,然后调用 SetEnv.cmd,它也不起作用...
虽然开始菜单链接工作正常。
郑重声明,尽管这很奇怪,但我现在的解决方案如下:
我创建了一个 MSBuild 文件,它在命令行上使用 CMake 创建解决方案文件,然后使用 MSBuild 任务调用创建的解决方案。 MSBuild 文件可以很容易地从 TeamCity 构建,尽管我需要一些额外的技巧来满足 CMake 愚蠢的寻找编译器,但我不会调用它的事情。不太令人满意,但它确实有效。
最佳答案
我的解决方案(设置%WindowsSdkPath%
,以便SetEnv.cmd
可以在%WindowsSdkPath%Bin\
下找到):
@ECHO OFF
IF "%WindowsSdkVersion%"=="" (
CALL :SetWindowsSdkVersionHelper HKCU > nul 2>&1
IF ERRORLEVEL 1 CALL :SetWindowsSdkVersionHelper HKLM > nul 2>&1
IF ERRORLEVEL 1 GOTO ERROR_NOWSDK
)
CALL :SetWindowsSdkPathHelper > nul 2>&1
IF ERRORLEVEL 1 GOTO ERROR_NOWSDK
GOTO END
:SetWindowsSdkPathHelper
SET WindowsSdkPath=
FOR /F "tokens=1,2*" %%i in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\%WindowsSdkVersion%" /V InstallationFolder') DO (
IF "%%i"=="InstallationFolder" (
SET "WindowsSdkPath=%%k"
)
)
IF "%WindowsSdkPath%"=="" EXIT /B 1
EXIT /B 0
:SetWindowsSdkVersion
CALL :GetWindowsSdkVersionHelper HKCU > nul 2>&1
IF ERRORLEVEL 1 CALL :GetWindowsSdkVersionHelper HKLM > nul 2>&1
IF ERRORLEVEL 1 EXIT /B 1
EXIT /B 0
:SetWindowsSdkVersionHelper
SET WindowsSdkVersion=
FOR /F "tokens=1,2*" %%i in ('REG QUERY "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /V "CurrentVersion"') DO (
IF "%%i"=="CurrentVersion" (
SET "WindowsSdkVersion=%%k"
)
)
IF "%WindowsSdkVersion%"=="" EXIT /B 1
EXIT /B 0
:ERROR_NOWSDK
ECHO The Windows SDK %WindowsSdkVersion% could not be found.
EXIT /B 1
:END
SetEnv.cmd
本身启发了我...
关于windows - 如何找到 Windows SDK 的 SetEnv.cmd/SetEnv.cmd 不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/887894/
我有一个简单的 std::setenv 调用,它在我的 gcc 下的 Linux 发行版上运行良好。但是,在我的 Mac OS X 上使用 clang 时,出现以下错误。 error: no memb
我们有一个正在运行的 Team City Build Server,并且想要编译一个 Visual C++ 项目。到目前为止,这很容易,因为我已经使用 Windows SDK 设置了 Windows
获取 在初始化程序中将类型表达式列表视为复合表达式在这两个函数调用上 - char itoa(new_total, new_total_ch, 10); int setenv("COU
我的学校要我实现setenv() 标准c库函数的行为。我不允许为此实现使用 setenv()。我该怎么做? 最佳答案 在 C 编程语言的许多实现中,尤其是在 POSIX 上,可以从 environ 全
我正在使用 C++ 和 setenv 设置变量,如下面的程序所示: setenv("TEST", "$HOME/test", 1); char* val = getenv("TEST"); print
在 Linux 中使用二进制环境变量时,我发现了一些奇怪的行为,似乎某些单个字节是错误的。我仔细检查了一下,似乎某些字节在提供给 setenv() 时总是会被错误地“转换”。看看这个: #includ
我在这里阅读了几篇文章,但仍然对 setenv() 的方式感到困惑作品: linux-where-are-environment-variables-stored where-is-the-envir
在我的.htaccess中我设置: SetEnv APPLICATION_ENV development 我想检查 APPLICATION_ENV 是否等于 development 然后运行 ap
我正在尝试使用 setenv() 设置新的环境变量。 但我注意到 setenv() 函数仅在我使用环境“extern char **environ”时设置我的新环境变量 但我想使用 main() 的参
所以我正在尝试构建一个简单的 shell,它可以添加、删除、获取和打印环境。我知道来自父进程的环境拷贝是通过 C++ 程序中的 int main() 获得的,但是在调用 setenv 之后,环境拷贝是
我无法设置 setenv.sh 文件正常工作。谁能帮我在服务器上设置它。 SETENVPATH="${CATALINA_BASE:-$CATALINA_HOME}" if [ -r "$SETENVP
我想通过虚拟机选项修改xml文件。 所以我这样写setenv.sh。 export JAVA_OPTS="$JAVA_OPTS -server -Drun.my_own_property=my_own
有没有办法使用 C 中的函数更改 pragma omp for 循环中的 schedule 类型?我试图在并行语句之前执行 setenv("OMP_SCHEDULE", "guided", 1);,但
我需要用户在文本文件中定义我的程序所需的所有环境变量,如下所示。 MyDLLPath = C:\MyDLLPath 我的选项 = 选项 1 PATH = %MyDLLPath%;%PATH%; 在我的
我正在为系统编程类(class)开发自定义 shell。我们被指示实现内置的 setenv() 和 unsetenv() 命令,并提示检查 putenv()。 我的问题是 setenv(char*,
我在 Linux 中开发了一个 Tcl/Tk 脚本工具。为了运行该工具,每次我都需要在 shell 中像这样设置环境变量: setenv LD_LIBRARY_PATH /opt/lsf/9.1/li
我有下面的方法,它正确地将 ret 值设置为 0(表示在 setenv 中成功),但是当我检查是否实际设置了这个环境变量时,它不存在。为什么会这样? void Class::mysetenv(cha
我编写了以下 C 代码来将环境变量设置为 \x09。但是当我使用 echo $EGG | hexdump,我看到它将它设置为 00。只有当第一个半字节为零时才会出现此问题。知道哪里出了问题吗? cha
我有一个简单的测试项目,期望在运行时打印 goroutine 调度消息。 从 Goland 配置设置 env 它可以工作。但它不是来自下面的代码,该应用程序不会打印调度信息。有没有人解释一下这里发生了
我在 Linux 中使用 tcsh 终端。在我通常使用的另一个终端中,我将一些许可证文件的路径设置如下: export PATH="$PATH:$MODEL_TECH" Tcsh shell 无法
我是一名优秀的程序员,十分优秀!