【问题标题】:WAF: Conflict between MinGW (GCC) and MSVC 2012WAF:MinGW (GCC) 和 MSVC 2012 之间的冲突
【发布时间】:2012-12-13 21:46:43
【问题描述】:

我刚刚在使用 WAF 时遇到了麻烦。我专门使用 MinGW-w64 来构建东西。但是,最近,我安装了 MSVC 2012,因为有时需要构建各种小型实用程序,这些实用程序在使用 MinGW 构建时会出现一些问题。

WAF 鼓励不要将编译器选择硬编码到wscript 中,而是从命令行中选择它,这听起来很合理,在这种情况下我同意这种理念。所以wscript 应该是这样的(忘记boost):

def options(ctx):
    ctx.load(('compiler_cxx', 'boost'))


def configure(ctx):
    ctx.load(('compiler_cxx', 'boost'))
    ctx.check_boost()

然后只需在命令行中键入:

waf --boost-includes=D:/Applications/Boost/include --check-cxx-compiler=gxx configure build

--check-cxx-compiler=gxx 强制 WAF 首先查找 MinGW,因为默认情况下,Windows WAF 首选 MSVC。

注意: MinGW-w64 在PATH 中,MSVC 不在,但我猜由于注册表,WAF 仍然可以找到它。

那么,WAF 在配置输出中给出了这个(这意味着一切都很酷):

Checking for 'gxx' (c++ compiler)        : D:\Applications\MinGW-w64\bin\g++.exe

然后它开始构建,我得到的是这么长的垃圾邮件:

Build failed
Traceback (most recent call last):
  File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Task.py", line 123, in process
    ret=self.run()
  File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Task.py", line 47, in run
    return m1(self)
  File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Task.py", line 47, in run
    return m1(self)
  File "<string>", line 28, in f
  File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Tools\msvc.py", line 685, in exec_command_msvc
    return self.exec_command_nomsvc(*k,**kw)

    ... (repeated thousands of times)

  File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Tools\msvc.py", line 685, in exec_command_msvc
    return self.exec_command_nomsvc(*k,**kw)
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Tools\msvc.py", line 684, in exec_command_msvc
    if self.env['CC_NAME']!='msvc':
  File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\ConfigSet.py", line 35, in __getitem__
    self=self.parent
RuntimeError: maximum recursion depth exceeded

MSVC 应该如何参与这个构建过程?! - 我不知道。但无论如何,最有趣的部分来了。让我们在wscript 中打破建议和硬编码 GCC 成为我们的选择:

def options(ctx):
    ctx.load(('boost'))


def configure(ctx):
    ctx.load(('gxx', 'boost'))
    ctx.check_boost()

然后我们调用:

waf --boost-includes=D:/Applications/Boost/include configure build

并在配置输出中查看:

Checking for program g++,c++             : D:\Applications\MinGW-w64\bin\g++.exe
Checking for program ar                  : D:\Applications\MinGW-w64\bin\ar.exe

注意:注意到输出的变化了吗?这对我来说已经是个谜了,因为cxx_compiler 工具(在前面的案例中使用)本身在幕后调用了ctx.load('gxx')。那么在这两种情况下,这两种输出有什么不同呢?

然后 WAF 开始构建,然后就可以了:

'build' finished successfully (1.155s)

很酷吧? :) 让我知道你们的想法,希望有人已经遇到过这种情况。

主演

WAF 1.7.8

MinGW-w64 (GCC 4.7.2)

MSVC 2012

【问题讨论】:

    标签: visual-c++ build mingw configure waf


    【解决方案1】:

    我向 Thomas Nagy 提交了一份错误报告,他发现这是由于最近的一个补丁造成的。恢复此补丁修复了该问题。有关详细信息,请参阅以下 2 个问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多