我最近安装了mingw-w64,并试图使用SCons构建程序。下面是一个例子 SConstruct
文件,我一直在尝试使用。
env = Environment(tools = ['mingw'])
env.Program('test.c')
然而,我得到了以下错误。
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
File "C:\Python27\Scripts\scons.py", line 199, in <module>
gcc -o test.o -c test.c
'gcc' is not recognized as an internal or external command,
operable program or batch file.
scons: *** [test.o] Error 1
scons: building terminated because of errors.
我已经把我的 PATH
变量,并能正确使用 gcc
通过命令行,所以SCons找不到它就很奇怪了。gcc的位置是 C:\Program Files\mingw-w64\mingw64\bin
.
另一个我觉得奇怪的地方是必须指定工具。man页面说mingw是它的第二偏好。我猜想这和上面的问题有关。
这个 SCons FAQ (可在项目网站上找到) https:/www.scons.org)对这个最常见的问题有了答案。为什么SCons找不到我的编译器链接器??
你必须将你的shell PATH传播到你的构建环境中。默认情况下,SCons会创建干净的构建环境,其中没有任何设置,这样就可以保证可重复构建。
如常见问题中所述,在你的SConstruct中添加以下内容。
import os
env = Environment(tools = ['mingw'], ENV = {'PATH' : os.environ['PATH']})
Scons不能正确检测 mingw-w64.
默认情况下,Scons会搜索多个编译器,直到找到一个。然而,对于mingw来说,它会寻找一个叫做 mingw32-gcc,对mingw-w64不起作用。
这可以从源码中看到。https:/bitbucket.orgsconssconsrawdefaultsrcengineSConsToolmingw.py。
# This is what we search for to find mingw:
key_program = 'mingw32-gcc'
你可以通过在mingw-w64中创建一个符号链接来解决这个问题。mingw64bin 目录中的 mingw32-gcc.exe 指向 gcc.exe (以Administrator身份运行cmd.exe,否则mklink将无法工作)。
c:\...\mingw64\bin> mklink mingw32-gcc.exe gcc.exe
你可以从 脏 命令,有了这个命令,一个简单的SConstruct就可以了。
10/27/2017 01:06 PM <SYMLINK> mingw32-gcc.exe [gcc.exe]
有了这个,一个简单的SConstruct就可以了 假设你的路径里有mingw -w64 gcc. exe:
d:\test>type SConstruct
Program('hello.c')
d:\test>scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o hello.o -c hello.c
gcc -o hello.exe hello.o
scons: done building targets.
顺便说一下,这是Scons在Windows上搜索的工具列表。https:/bitbucket.orgsconssconsrawdefaultsrcengineSConsTool__init__.py。
def tool_list(platform, env):
...
if str(platform) == 'win32':
"prefer Microsoft tools on Windows"
linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ]
c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ]
cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'cxx', 'bcc32' ]
...
另外,scons的manpage中有一段关于使用MINGW的片段。
MinGW
MinGW bin目录必须在您的PATH环境变量中,或者在ENV构造变量下的PATH变量中,SCons才能检测和使用MinGW工具。当在本地Windows Python解释器下运行时,如果两者都安装了,SCons将优先选择MinGW工具而不是Cygwin工具,不管PATH变量中bin目录的顺序如何。如果您同时安装了MSVC和MinGW,并且您想使用MinGW而不是MSVC,那么您必须通过传入
tools=['mingw']到Environment()函数中,因为SCons会更喜欢MSVC工具而不是MinGW工具。
也就是说,也许在SCons的MINGW默认搜索路径中添加更多的默认位置是有意义的。
目前它将检查环境()的PATH,然后查看c:\MinGW\bin
同时搜索 "mingw32-gcc"
但对于mingw-w64来说,默认的二进制文件似乎是gcc.exe和or x86_64-w64-mingw32-gcc.exe(或i686-w64-mingw32-gcc.exe)?