代码之家  ›  专栏  ›  技术社区  ›  sunny moon

QBS构建系统,无法使用vcvars64.bat初始化环境

  •  0
  • sunny moon  · 技术社区  · 6 年前

    我试图实现我自己的模块,用ClangCL工具链在Windows上构建C++,因为目前没有QBS中的内置支持。

    我选择使用LLD链接而不是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") ,因此结果为空。QBS文档 Process.getEnv() 在这方面什么也不说。

    用什么方法初始化环境? VCVAS66BAT 更广泛地说,正确的方法是什么? 设置构建环境 ?


    [更新] 嗯,令人尴尬的是,通过创建一个简单的批处理并除去 设置构建环境 全部脚本:

     @echo off
     call vcvars64 && qbs
    

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Christian Kandeler    6 年前

    vars批处理文件只是将一些信息转储到控制台上。它不会以任何方式在调用进程上设置环境。您需要分析进程输出。我建议您查看qbs源中的msvcprobe项,以了解如何为msvc实现该项。您可能能够修改clang-cl的代码。