为什么Sconstruct中的某些python语句不执行?

问题描述

一个文件夹中有多个c语言文件。我不想每次都编译所有c文件。我写了一个Sconstruct。我想使用一些选项来控制编译哪个文件

import os
import sys
input = sys.argv
env = Environment(CC = 'gcc')
env.Program('testC','cExample.c')

以上代码可以正常执行。但是以下代码显示错误:我使用cExample.cscons cExample.c不需要做任何事情。未生成testC文件。我进行了测试,发现它确实输入了if语句

import os
import sys
env = Environment(CC = 'gcc')
# env.Program('testC','cExample.c')
if 'cExample.c' in sys.argv:    
    print('here')
    env.Program('testC','cExample.c')

它仍然显示

scons: nothing to be done for `cExample.c'.
scons: done building targets.

对不起您没有解释清楚。这段代码写在一个Sconstruct文件中。它的功能类似于MakeFile文件。句子env.Program('testC','cExample.c')是将cExample.c编译成一个testC可执行文件。如果将env.Program('testC','cExample.c')放在if外部(如注释的第四行),则cExample.c可以正常编译,如果它位于if内部(如现在所示),则cExample .c未成功编译。

解决方法

如果您输入:

scons cExample.c

假设未生成文件,而只是坐在磁盘上,SCons当然会说

scons: Nothing to be done for `cExample.c'.

从cExample.c构建的文件将是cExample.o(或为对象设置的.obj或其他后缀)。

所以:

scons cExample.o

将指示SCons仅构建该文件。

使用SConstruct作为

env = Environment(CC = 'gcc')
my_obj = env.Object('cExample.c')
env.Alias('myobject',my_obj)
env.Program('testC',my_obj)

然后您可以运行

scons myobject

那只会编译您的.c-> .o