我正在尝试使用带有SCons的g ++构建一个简单的c ++ hello world程序。如何指定我希望SCons使用g ++,而不依赖外部环境变量(例如PATH)?
这是我尝试过的:
env = Environment(CXX = 'C:/cygwin/bin/g++')
env.Program('helloworld.c++')
这是我的结果:
scons: warning: No version of Visual Studio compiler found - C/C++
compilers most likely not set correctly
File "C:\Python27\Scripts\scons.py", line 201, in <module>
C:/cygwin/bin/g++ /Fohelloworld.obj /c helloworld.c++ /TP /nologo
g++: error: /Fohelloworld.obj: No such file or directory
g++: error: /c: No such file or directory
g++: error: /TP: No such file or directory
g++: error: /nologo: No such file or directory
scons: *** [helloworld.obj] Error 1
scons: building terminated because of errors.
答案 0 :(得分:0)
答案是staring me straight in the face。我的第一个问题是答案的第一部分:
import os
env = Environment(ENV = {'PATH' : os.environ['PATH']})
利用了我明确想要避免的OS PATH。我的第二个问题是我完全忽略了下面的答案,这是我的问题的准确答案:
保证构建可重复的方法是显式 初始化PATH
path= ['/bin', '/usr/bin', '/path/to/other/compiler/bin']
env = Environment(ENV = {'PATH' : path})
我之所以没有意识到这是解决方案的原因是因为我只是误解了env['ENV']['PATH']
和os.environ['PATH']
是完全独立和不同的。 os.environ['PATH']
显然是外部的OS路径,而env['ENV']['PATH']
似乎是 SCons的内部等效物。您可以设置为随心所欲。
最后,我选择了一种精确的解决方案,对我来说,最易读的是:
PATH = {'PATH' : ['C:/cygwin/bin']}
env = Environment(ENV = PATH)
env['ENV'] = PATH
env['CXX'] = 'g++'
env.Program('helloworld.c++')
答案 1 :(得分:0)
更简洁的方式
Find: \|+$
Replace: (leave empty)
另一种方式:
env = Environment(tools=['g++','gnulink'])
env['ENV']['PATH'] = ['C:/cygwin/bin']
env['CXX'] = 'g++'
env.Program('helloworld.c++')
答案 2 :(得分:0)
试试这个:
env = Environment(tools=['ar', 'cc', 'clang', 'clangxx', 'gcc', 'g++', 'gnulink', 'link'], ENV=os.environ, toolpath=['custom_path'])
。
上面的命令将:
地点:
集合:$AR、$ARCOM、$ARFLAGS、$LIBPREFIX、$LIBSUFFIX、$RANLIB、$RANLIBCOM、$RANLIBFLAGS。
集合:$CC、$CCCOM、$CCFLAGS、$CFILESUFFIX、$CFLAGS、$CPPDEFPREFIX、$CPPDEFSUFFIX、$FRAMEWORKPATH、$FRAMEWORKS、$INCPREFIX、$INCSUFFIX、$SHCC、$SHCCCOM、$SHCCFLAGS、$SHCFLAGS、 $SHOBJSUFFIX。
clang:为 Clang C 编译器设置构造变量。
集合:$CC、$CCVERSION、$SHCCFLAGS。
clangxx:为 Clang C++ 编译器设置构造变量。
集合:$CXX、$CXXVERSION、$SHCXXFLAGS、$SHOBJSUFFIX、$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME。
g++:为 gXX C++ 编译器设置构造变量。
集合:$CXX、$CXXVERSION、$SHCXXFLAGS、$SHOBJSUFFIX。
gcc:为 gcc C 编译器设置构造变量。
集合:$CC、$CCVERSION、$SHCCFLAGS。
gnulink:为 GNU 链接器/加载器设置构造变量
集合:$LDMODULEVERSIONFLAGS、$RPATHPREFIX、$RPATHSUFFIX、$SHLIBVERSIONFLAGS、$SHLINKFLAGS、$_LDMODULESONAME、$_SHLIBSONAME。
link:为通用 POSIX 链接器设置构造变量。这是一个“智能”的链接器工具,它根据源文件的类型选择编译器来完成链接。
集合:$LDMODULE、$LDMODULECOM、$LDMODULEFLAGS、$LDMODULENOVERSIONSYMLINKS、$LDMODULEPREFIX、$LDMODULESUFIX、$LDMODULEVERSION、$LDMODULEVERSIONFLAGS、$LIBDIRPREFIX、$LIBDIRSUFFIX、$IXFFFIX、$LIBLIBLINKPLINK $SHLIBSUFFIX、$SHLINK、$SHLINKCOM、$SHLINKFLAGS、$__LDMODULEVERSIONFLAGS、$__SHLIBVERSIONFLAGS.用途:$LDMODULECOMSTR、$LINKCOMSTR、$SHLINKCOMSTR
或者您可以通过以下方式为您的系统使用默认配置工具:
env = Environment(tools=['default'], ENV=os.environ)
引用 scons man 4.1.0
默认
<块引用>为工具模块的默认列表设置构造变量。采用 工具列表中的默认值保留原始默认值,因为 tools 参数被视为 在该构建环境中可用的工具,而不是 补充。
<块引用>默认选择的工具列表不是静态的,而是 取决于平台和安装的软件 平台。如果底层命令是,则某些工具将不会初始化 未找到,一些工具是从选项列表中选择的 一个初步发现的基础。可查看成品刀具清单 通过检查构造中的 TOOLS 构造变量 环境。
<块引用>在所有平台上,以下列表中的所有工具都是 选择满足各自条件的文件系统,wix,lex, yacc、rpcgen、swig、jar、javac、javah、rmic、dvipdf、dvips、gs、tex、 乳胶、pdflatex、pdftex、tar、zip、文本文件。
<块引用>在 Linux 系统上, 默认工具列表选择(首次发现):来自 gcc 的 C 编译器, 英特尔、ICC、CC;来自 g++、intelc、icc、cxx 的 C++ 编译器;一个 来自gas、nasm、masm的汇编程序;来自 gnulink、ilink 的链接器;一种 Fortran 编译器来自 gfortran、g77、ifort、ifl、f95、f90、f77;和一个 静态存档器'ar'。它还选择从列表 m4 中找到的所有内容, 转速。
<块引用>在 Windows 系统上,默认工具列表选择 (首次发现):来自 msvc、mingw、gcc、intelc、icl 的 C 编译器, 国际商会、抄送、密件抄送32;来自 msvc、intelc、icc、g++、cxx 的 C++ 编译器, bcc32;来自 masm、nasm、gas、386asm 的汇编程序;来自 mslink 的链接器, gnulink、ilink、linkloc、ilink32;来自 gfortran 的 Fortran 编译器, g77、ifl、cvf、f95、f90、fortran;和来自 mslib、ar 的静态存档器, tlib;它还选择从列表 msvs、midl 中找到的所有内容。
<块引用>在 MacOS 上 系统,默认工具列表选择(先找到):一个 C 编译器 来自 gcc, cc;来自 g++、cxx 的 C++ 编译器;汇编程序“as”;一种 来自 applelink、gnulink 的链接器;来自 gfortran、f95 的 Fortran 编译器, f90,g77;安达静态存档器 ar。它还选择所有从 列出 m4,rpm。
<块引用>其他平台的默认列表可以通过以下方式找到 检查 scons 源代码(参见 SCons/Tool/init.py)。