Scons 在使用 SConscript 文件时更改编译器
Scons changes compiler when using an SConscript file
我刚刚开始看scons
我创建了一个简单的测试.cpp
#include <iostream>
int main(int argc, char ** argv) {
std::cout << "Hello Worldn";
return 0;
}
并给了它一个SConstruct文件
env = Environment()
env.Program(target='Hello', source=['test.cpp'])
它完美地编译
g++ -o test.o -c test.cpp
g++ -o Hello test.o
现在,我将这个 Sconstruct 文件的内容转移到 SConscript 文件并在 SConstruct 中输入以下内容
SConscript('SConscript', variant_dir='.build_release', duplicate=0, exports={'MODE':'release'})
SConscript('SConscript', variant_dir='.build_debug', duplicate=0, exports={'MODE':'debug'})
scons 选择 GCC 而不是 g++
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: .build_release .build_debug
gcc -o .build_debug/Hello test.o
Undefined symbols for architecture x86_64:
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in test.o
然后是一页半的错误。
如果我用 g++ 替换 gcc 并从命令行运行,它会再次完美运行。
谁能解释为什么它从 g++ 变成了 gcc 以及我应该怎么做?
你需要使用 exports=["env"] 将 SConstruct 环境传播到 SConscript。
Eg.in 指导:
env = Environment(CFLAGS = CFLAGS, CPPDEFINES = [])
conf = env.Configure()
vars = Variables()
vars.AddVariables(
BoolVariable("verbose", "Set to show compilation lines", False),
BoolVariable("release", "Set to make a release build", False),
EnumVariable("flavour", "Choose a build flavor", "debug",
allowed_values = ("release","debug"),
ignorecase = 2),
PathVariable("CC", "The C compiler", "clang", PathVariable.PathAccept),
PathVariable("CXX", "The C++ compiler", "clang++", PathVariable.PathAccept),
)
vars.Update(env)
SConscript(dirs = dirs, exports=["env", "conf"], name = "SConscript")
在 SConscript 中:
Import("env", "conf")
env.Program(target='Hello', source=['test.cpp'])
在此之后,SConstruct 中配置的所有设置对于 SConsript 也将相同。
请参阅我的另一篇文章以获取更大的示例。
希望对您有所帮助。
编辑:我看到已经在评论中回答了。有趣,感谢您提供的信息。
相关文章:
- G++编译器:无法写入文件
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- Arduino-Makefile:编译器无法编译用户库 cpp 文件
- 张量流错误 此文件需要编译器和库支持 ISO C++ 2011 标准
- 为什么不同的编译器会生成不同大小的文件?
- G++ 编译器无法识别 SQLAPI.h 头文件
- 检测到 Conan 配置文件设置与 CMake 之间的编译器版本不匹配
- 为什么 C++ 编译器在"c:program filesgnu emacsinclude"中查找包含文件?
- 编译器正在查找.当"实施"完全在"我的"中时的CPP文件.HPP文件
- C++程序编译器在使用g++命令编译后自动运行exe文件
- Visual Studio 2015资源视图和资源编译器使用不同的方法在项目目录中查找图标文件.如何修复
- 如何在cmake工具链文件中设置编译功能,以便已知的自定义编译器使用target_compile_features
- VS2019编译器将没有BOM文件的UTF8错误解释为ANSI
- 删除编译器优化并在发布中启用 pdb 文件
- 'void *' 'void (*) (bool)' 指针使用 c ++ 编译器在 C 中编译文件的错误
- 是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
- 将内存文件添加到 clang 编译器实例
- 如何使用 cmake 来确保 C++14 编译器与实验文件系统 TS 库的链接?
- 致命错误 C1001:内部编译器错误(编译器文件"MSC1.cpp",第 1794 行)
- 如何修复此编译错误:(编译器文件'F:\DD\VCtools\编译器\CXXFE\SL\P1\C\Template.cpp',第 22679 行)?