0

我正在尝试使用 clang-cl 工具链实现我自己的模块以在 Windows 上构建 C++,因为目前 QBS 中没有内置支持。

我选择使用 lld-link 而不是 microsoft 链接器,因此我必须手动为其提供所有 MS 库包含路径。通过硬编码这些路径,我可以很好地构建我的应用程序。但我想让我的模块更灵活,并使用由|%LIB%设置的环境变量。vcvars32.batvcvars64.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"),因此结果为空。QBS 文档Process.getEnv()在这方面没有任何说明。

初始化环境的正确 QBS 方法是vcvars64.bat什么,更广泛地说,获取内部进程环境的正确方法是什么setupBuildEnvironment


[更新] 好吧,尴尬的是,这很容易通过创建一个简单的批处理并完全摆脱setupBuildEnvironment脚本来解决:

 @echo off
 call vcvars64 && qbs

但我想尽可能避免批处理脚本,所以问题仍然存在。

4

1 回答 1

1

The vars batch files just dump some information onto the console. That does not set an environment on the calling process in any way. You would need to parse the process output. I suggest you take a look at the MsvcProbe item in the qbs sources to see how that is implemented for MSVC. You might be able to adapt the code for clang-cl.

于 2019-01-21T11:25:00.823 回答