我正在尝试实现自己的模块,以便使用clang-cl工具链在Windows上构建C ++,因为QBS目前没有内置支持。
我选择使用lld-link而不是Microsoft链接程序,因此我必须手动为其提供所有MS库包含路径。通过这些路径的硬编码,我可以很好地构建我的应用程序。但是我想使我的模块更加灵活,并使用%LIB%
| vcvars32.bat
vcvars64.bat
环境变量
据我了解,这可以(应该?)在模块的setupBuildEnvironment
脚本中完成。这是我尝试阅读%LIB%
并失败的内容:
import qbs.Environment
import qbs.Process
Module
{
setupBuildEnvironment:
{
var p = new Process();
p.exec("vcvars64.bat", [], true);
// makes no difference
// p.exec("cmd", ["/c", "vcvars64.bat"], true);
var lib = p.getEnv("LIB");
// this fails too
// var lib = Environment.getEnv("LIB");
console.info("LIB = " + lib);
p.close();
}
...
}
这给了我LIB =
,所以我一无所获。我的猜测是,在查询变量(p.getEnv("LIB")
)时,该过程已经终止,因此结果为空。 Process.getEnv()
的QBS文档在这方面没有说明。
用vcvars64.bat
初始化环境的正确QBS方法是什么,更广泛地说,在setupBuildEnvironment
内获取进程环境的正确方法是什么?
[更新]
好吧,令人尴尬的是,通过创建简单的批处理并完全摆脱setupBuildEnvironment
脚本,可以轻松解决此问题:
@echo off
call vcvars64 && qbs
但是我想尽可能避免批处理脚本,因此问题仍然存在。
答案 0 :(得分:1)
vars批处理文件只是将一些信息转储到控制台上。这不会以任何方式在调用进程上设置环境。您将需要解析流程输出。我建议您看一看qbs源中的MsvcProbe项,以了解如何为MSVC实施。您也许可以修改clang-cl的代码。