Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连续运行两次后的SCON行为_C++_Build_Environment_Scons - Fatal编程技术网

C++ 连续运行两次后的SCON行为

C++ 连续运行两次后的SCON行为,c++,build,environment,scons,C++,Build,Environment,Scons,我正在尽可能方便地配置SCON。我的构建脚本工作得很好,但有一件事我仍然有困难 对于make,如果我连续两次运行'make',第二次将什么也不做,因为它将检测到目标是最新的(因为我刚刚构建了它) 如何确保scons的行为相同?现在,如果我再次运行scons,它会认为需要再次构建目标,而且,由于所有剩余的.o文件的依赖关系冲突(因为没有首先调用clean),它无法构建目标 我如何让SCON自行处理此问题,即检测目标是否过期,如果过期,则进行相应的重建 还有,我注意到如果我打电话 scons sco

我正在尽可能方便地配置SCON。我的构建脚本工作得很好,但有一件事我仍然有困难

对于make,如果我连续两次运行'make',第二次将什么也不做,因为它将检测到目标是最新的(因为我刚刚构建了它)

如何确保scons的行为相同?现在,如果我再次运行scons,它会认为需要再次构建目标,而且,由于所有剩余的.o文件的依赖关系冲突(因为没有首先调用clean),它无法构建目标

我如何让SCON自行处理此问题,即检测目标是否过期,如果过期,则进行相应的重建

还有,我注意到如果我打电话

scons
scons -q
一个构建,然后直接提问,退出状态仍然始终为1。如果我理解正确,它应该是0,因为目标是最新的

感谢您的帮助

编辑:

这是我的SConstruct文件。如果我做错了什么,请提醒我:

import os

env = Environment(CXX = "C:/MinGW/bin/g++", CCFLAGS = "-g")
env.Tool("mingw")

sourceList = list('./src/' + x for x in os.listdir("./src"))

pathList = ['./include',
            'C:/boost',
            'C:/frameworks/SFML/include',
            'C:/Python27/include']

libPathList = ['C:/boost/stage/lib', 'C:/frameworks/SFML/lib', 'C:/Python27/libs']
libList = ['boost_thread-mgw45-mt-1_46_1',
           'boost_python-mgw45-mt-1_46_1', 
           'sfml-system',
           'sfml-window',
           'sfml-graphics',
           'python27']

env.Append(CPPPATH=pathList)
env.Append(LIBPATH=libPathList)
env.Append(LIBS=libList)

t = env.Program(target='./bin/build_result.exe', source=sourceList)
Default(t)
是的,我知道我应该添加正确的调试选项,但我可以在以后完善该文件。然而,我不知道是否有任何问题与我所经历的有关。此外,该文件适用于较小的测试项目:

import os

env = Environment(CXX = "C:/MinGW/bin/g++", CCFLAGS = "-g")
env.Tool("mingw")

sourceList = os.listdir('.')
sourceList = list(x for x in sourceList if x[-3:] == 'cpp')

t = env.Program(target='./result.exe', source=sourceList)
Default(t)

“scons-q”也像预期的那样工作。知道发生了什么吗?

啊哈,发现了问题。在这一行下面:

sourceList = list('./src/' + x for x in os.listdir("./src"))
我应该补充一句

sourceList = list(x for x in sourceList if x[-3:] == 'cpp')

第一个build.o文件是在./src目录中生成的,所以第二次它将对象文件作为源文件。问题已解决。

指定要在SCON中编译的源文件的更常见方法如下:

sourceList = Glob('#/src/*.cpp')
t = env.Program(target='#/bin/build_result.exe', source=sourceList)
请注意路径中的
“#”
字符。在SCON中,表示相对于SConstruct文件所在的目录


此外,您可以配置SConstruct文件中的所有内容,然后使用SConscript()函数在
src
dir中加载SConscript文件,这将导入在SConstruct中创建的env,并简单地指定要编译的文件和必要的目标。这将更适合未来,更容易添加更多的源目录,每个目录都有自己的SConscript文件。这被称为。

Scons默认执行您所描述的操作(请在一个简单的“hello world”类型的应用程序上尝试查看)。因此,您看到的原因与
SConstruct
文件的特定内容有关。你能提供一个简单的例子来说明同样的行为吗?SCons是我使用过的最智能的系统,它只考虑构建需要的东西。你在某处遇到了一些奇怪的问题。:)我完全同意到目前为止我印象深刻。这就是为什么我感到困惑。嘿,我尝试了一个像你建议的更简单的例子,并在上面发布了两个文件。它是否与项目结构(目录智能)或包含或库有关?请考虑使用<代码> GOLB函数。@ USER8999,很乐意帮助。我在对相应文档的回答中添加了3个不同的链接。