如何在不依赖任何外部环境变量的情况下使用带有SCons的g ++构建程序?

时间:2019-01-22 08:33:17

标签: g++ scons

我正在尝试使用带有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.

3 个答案:

答案 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'])

上面的命令将:

  1. 创建一个 Environment 类型的变量 env
  2. 告诉 scons 设置需要工具。
  3. 在系统变量中找到这些工具。
  4. 否则在自定义路径中查找(如果不需要,可以省略最后一个参数:toolpath=['custom_path'])。

地点:

  • ar:为 ar 库归档器设置构造变量。

集合:$AR、$ARCOM、$ARFLAGS、$LIBPREFIX、$LIBSUFFIX、$RANLIB、$RANLIBCOM、$RANLIBFLAGS。

  • cc:为通用 POSIX C 编译器设置构造变量。

集合:$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)。