Tag: scons

SConscript中的SharedLibrary的CCCOMSTR / LINKCOMSTR不起作用

我对SCons很新,并注意到当我在SConscript中构建共享库时,CCCOMSTR和LINKCOMSTR将无法工作。 这是我的SConstruct的简化版本: CFLAGS = [“-Wall”, “-pedantic”, “-std=c99”] # building environment env = Environment(CFLAGS = CFLAGS, CPPDEFINES = [“DEBUG”]) # checking dependencies conf = env.Configure() conf.CheckHeader(“stdlib.h”) conf.CheckHeader(“string.h”) conf.CheckLib(“libdl”) env[“CCCOMSTR”] = “Compiling $SOURCE …” env[“LINKCOMSTR”] = “Linking $TARGET …” SConscript(dirs = [“lib1”, “lib2”], exports=[“env”, “conf”], name = “SConscript”) # main function env.Program(target = “prog”, LIBS=[“libdl”], source = […]

SCons库和子库

我有一个基于SCons的分层构建系统。 我有一个根SConstruct调用SConscript构建一个共享库,然后调用另一个SConscript构建一个依赖于共享库的可执行文件。 所以这是我的问题:我对linux上的共享库的理解是,当你想为将要使用共享库的可执行文件做最后的ld链接时,共享库必须作为源包含在可执行文件的ld命令行中引用它(除非它在标准位置,在这种情况下-l选项有效)。 所以这就像我的SCons文件一样: === rootdir / SConstruct env=DefaultEnvironment() shared_lib = SConscript(‘foolib/SConscript’) env.Append( LIBS=[shared_lib] ) executable = SConscript(‘barexec/SConscript’) === rootdir / foolib / SConscript env=DefaultEnvironment() env.Append(CPPPATH=Glob(‘inc’)) penv = env.Clone() penv.Append(CPPPATH=Glob(‘internal/inc’)) lib = penv.SharedLibrary( ‘foo’, source=[‘foo.c’, ‘morefoo.c’] Return(“lib”) === rootdir / barexec / SConscript env=DefaultEnvironment() exe = env.Program( ‘bar’, source=[‘main.c’, ‘bar.c’, ‘rod.c’] ) Return(“exe”) 所以这里的问题是这一行: env.Append( […]

如何根据编译器类型在SConstruct for C编译器中设置选项?

我需要为C编译器设置其他选项,例如添加标志以打开所有警告,具体取决于编译器的类型。 例如,我应该使用MSVC env.Append(CPPFLAGS = “/Wall”) 但对于mingw(gcc)我需要使用: env.Append(CCFLAGS = “-Wall”) 我怎样才能以scons的方式做到这一点?

如何为使用SCons构建的程序构建gprof支持?

问候, 这是我的SConstruct文件: env = Environment() env.Append(CCFLAGS=[‘-g’,’-pg’]) env.Program(target=’program1′, source= [‘program1.c’]) 这里还有编译的输出: scons: Reading SConscript files … scons: done reading SConscript files. scons: Building targets … gcc -o program1.o -c -g -pg program1.c gcc -o program1 program1.o scons: done building targets. 如您所见,我将“-pg”选项传递给构建环境。 在我构建之后,我运行程序来生成“gmon.out”但它没有生成。 谁能证实这个问题? 还是有解决方案? 谢谢。 更新: 感谢此处给出的建议,更新的工作SConstruct文件如下所示。 链接器需要标志,因此要通过scons传递它,必须使用“LINKFLAGS”选项。 env = Environment() env.Append(CCFLAGS=[‘-g’,’-pg’], LINKFLAGS=[‘-pg’]) env.Program(target=’program1′, source= [‘program1.c’]) […]

使用SCons更改Linux中的默认C编译器

在我的Linux平台上,我有几个版本的gcc 。 在usr/bin我有: gcc34 gcc44 gcc 以下是一些输出: $ gcc –version gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48) $ gcc44 –version gcc44 (GCC) 4.4.0 20090514 (Red Hat 4.4.0-6) 我需要使用4.4版本的gcc但默认似乎是4.1版本。 我有办法替换/usr/bin/gcc并使gcc44成为默认编译器而不使用符号链接到/usr/bin/gcc44吗? 我不能使用符号链接的原因是因为我的代码必须使用mock在RPM包中提供。 mock从头开始创建一个最小的linux安装,并在编译我的代码之前安装指定的依赖项。 我不能自定义这个“最小安装”。 理想情况下,完美的解决方案是安装一个官方RPM软件包,用gcc44替换gcc作为默认编译器。 有这样的套餐吗? 这甚至可能/好吗? 附加信息 我必须使用SCons (替代品)并且它不允许我指定用于gcc的二进制文件。 我也会接受任何答案,告诉我如何在我的SConstruct文件中指定gcc二进制文件。

为什么SCons VariantDir()没有将输出放在给定目录中?

我正在考虑将SCons用于新项目。 它看起来非常好,虽然我发现VariantDir非常混乱。 我有一个简单的项目,在一个目录中有一些C源文件,我想在“正常”和“配置文件”模式下构建 – 与gcc有两组不同的选项。 我希望输出分别进入普通的/和profile /目录。 为了测试,我已经减少了一个源文件tc,其中有一个main() 。 我的SConstruct文件位于同一目录中,如下所示: normal = DefaultEnvironment(tools=[‘mingw’], CCFLAGS = ‘-O2’) normal.VariantDir(‘release’, ‘.’, duplicate=0) normal.Program(‘t’, [‘t.c’]) #profile = normal.Clone(CCFLAGS=’-O2 -pg’, LINKFLAGS = ‘-pg’) #profile.VariantDir(‘profile’, ‘.’, duplicate=0) #profile.Program(‘t’, [‘t.c’]) 当我运行scons时,我希望它能将t.exe放入release /,但它会将它们放在当前目录中。 并且我无法运行它,并且3个配置文件行未注释 – 如果我这样做,我会收到此错误: scons:***为同一目标指定了两个具有不同操作的环境:to 基本上,我不确定为什么我的VariantDir()调用没有告诉scons将输出放在指定的输出目录中, release 。 (我在文档和新闻组中读了很多,但没有回答这个问题。我最接近的是这个页面 ,它描述了一个类似的东西,但它涉及一个单独的src /目录和两个独立的scons文件,以及在它们之间导入/导出变量。这看起来不太愉快。)