今天正式是我使用C++的第一天:P
我已经下载了适用于Windows Server 2003 SP1的Visual C++ 2005 Express Edition和Microsoft Platform SDK,因为我想了解开源的Enso Project.
所以,在安装scons之后我去了控制台并尝试使用scons编译它,但是我收到了这个错误:
C:\oreyes\apps\enso\enso-read-only\src\platform\win32\Include\WinSdk.h(64) : fatal error C1083: Cannot open include file: 'Windows.h': No such file or directory
scons: *** [src\platform\win32\InputManager\AsyncEventProcessorRegistry.obj] Error 2
scons: building terminated because of errors.
Run Code Online (Sandbox Code Playgroud)
检查这些链接后:
我设法像这样配置我的安装:

甚至运行这个脚本

我设法在IDE中编译下面的文件.
// Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我仍然在控制台中得到了这个例外.有没有人有scons经验?
编辑
实际上(我忘了告诉你)我用"Visual Studio 2005命令提示符"链接启动了命令提示符.
我假设这将包括环境变量中的路径.打印后我发现它没有:
echo …Run Code Online (Sandbox Code Playgroud) 我正在考虑将SCons用于新项目.它看起来真的很好,虽然我发现VariantDir很混乱.
我有一个简单的项目,在一个目录中有一些C源文件,我想在"正常"和"配置文件"模式下构建 - 与gcc有两组不同的选项.我希望输出分别进入普通/和配置文件/目录.
为了进行测试,我已经减少了一个源文件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'])
Run Code Online (Sandbox Code Playgroud)
当我运行scons时,我希望它将to和t.exe放入release /,但它将它们放在当前目录中.并且我无法运行它,并且3个配置文件行未注释 - 如果我这样做,我会收到此错误:
scons:***为同一目标指定了两个具有不同操作的环境:to
基本上,我不确定为什么我的VariantDir()调用没有告诉scons将输出放在指定的输出目录中release.
(我在文档和新闻组中读了很多,但没有回答这个问题.我最接近的是这个页面,它描述了类似的东西,但它涉及一个单独的src /目录和两个独立的scons文件,以及在它们之间导入/导出变量.这看起来不太愉快.)
我可以File('foo.bar').abspath用来获取文件的位置,但是如果我设置了variant_dir,那么返回的路径将在variant_dir而不是它的原始位置.如果我已duplicate=0设置,则返回的文件实际上不存在.
显然,SCons知道原始文件的位置,因为它在文件实际构建时作为参数传递(例如gcc -c -o variant/foo.o orig/foo.c).
有什么File('foo.bar').origpath我可以使用的吗?
如果它来了我可以使用,os.path.join(Dir('#').abspath, 'orig')但这需要SConscript知道它在哪个目录,这是凌乱的.
我是scons和Python的新手.我想知道是否有办法在python脚本中调用scons.
我的python脚本从用户接受一个目录列表,其中要编译的代码位于其中(除了执行其他一些非平凡的事情).它还生成一个字符串,用作scons创建的可执行文件的名称.
我想将这些信息从我的python脚本传递给scons,然后调用scons.有一个简单的方法吗?
我可以想到以下几种可能性:
subprocess.call("scons"...)我不确定scons是否接受我需要传递的所有信息作为命令行参数在SCons脚本中,我创建了一个基础环境,我从中导出了其他环境.像这样的东西:
base = Environment()
base['CXXFLAGS'] += ['-DBOOST_HAS_PTHREAD', '-D__STDC_CONSTANT_MACROS', '-DFILELOG_MAX_LEVEL=4', '-Wall']
opt = base.Clone()
opt['CXXFLAGS'] += ['-DNDEBUG', '-O3']
Run Code Online (Sandbox Code Playgroud)
这样,我可以从基础环境创建更多环境(release/debug/instrumented/pgo).在SCons文档中,它说env.Clone()执行env的深层副本.但事实上它似乎没有用.因为在示例中,基本环境将应用-DNDEBUG和-O3标志.
我做错了什么?
编辑:这是真正的代码.这段代码中有两个打印语句,我认为它们应该打印相同的东西,但它们不会.输出如下:
# -*- coding: utf-8 -*-
import os.path
import glob
local_env = Environment()
local_env['CXXFLAGS'] += ['-DBOOST_HAS_PTHREAD', '-D__STDC_CONSTANT_MACROS', '-DFILELOG_MAX_LEVEL=4', '-Wall']
local_env.Append(LIBS = ['pthread', 'boost_thread', 'boost_filesystem', 'boost_program_options', 'boost_iostreams'])
opt = local_env.Clone()
opt['CXXFLAGS'] += ['-DNDEBUG', '-O3']
print opt['CXXFLAGS']
instr = opt.Clone()
instr['CXXFLAGS'] += ['-fprofile-arcs']
instr['LIBS'] += ['gcov']
print opt['CXXFLAGS']
Run Code Online (Sandbox Code Playgroud)
输出 :
|| scons: Reading SConscript files ...
|| -DBOOST_HAS_PTHREAD -D__STDC_CONSTANT_MACROS -DFILELOG_MAX_LEVEL=4 -Wall -DNDEBUG -O3 …Run Code Online (Sandbox Code Playgroud) 我有一个python包,其中包含构建扩展所需的一些C代码(具有一些非常重要的构建需求).我使用SCons作为我的构建系统,因为它非常好而且灵活.
我正在寻找一种方法来编译我的python扩展与SCons准备与distutils一起分发.我希望用户只需键入setup.py install并获取使用SCons编译的扩展,而不是默认的distutils构建引擎.
想到的一个想法是在distutils中重新定义build_ext命令,但我找不到它的大量文档.
有什么建议吗?
我试图SCons生成多个目标(直接编号未知SConscript).
我有这样的目录:
headers/
Header1.h
Header2.h
Header3.h
Header4.h
meta/
headers_list.txt
Run Code Online (Sandbox Code Playgroud)
现在我想要SConscript读取headers_list.txt,基于其内容选择文件从headers/目录(即它可能只包含Header1和Header3),对于我想要使用某些函数生成源的每一个.
我一直试图用env.Command它来做,但问题是它需要调用者指定目标列表,由于显而易见的原因在调用时不知道env.Command.
我唯一能想到的就是跑步:
for header in parse( headers_file ):
source = mangle_source_name_for_header( header )
env.Command( source, header, generator_action )
Run Code Online (Sandbox Code Playgroud)
但这意味着parse( headers_file )每次调用时我都会运行scons.如果解析成本高昂且文件不经常更改,则可以轻松缓存此步骤.
为实现缓存,我缺少什么SConsc构造/类/技术?
编辑:
看来我的问题类似于SCons目标的构建时间确定,但是没有人工虚拟文件的技术吗?
此外,即使使用临时文件,我也看不出我应该如何将target变量从Command生成可变数量的目标传递给第二个将迭代它们的目标.
编辑2:
这很有希望.
我目前正在设置SCons,以便将Windows作为主机操作系统进行交叉编译.我正在Environment为交叉编译器构建一个自定义,但SCons坚持每次启动时都会查找Visual Studio(并打印出一个无法找到它的警告,因为我没有安装它).我可以阻止它寻找我知道我不打算使用的标准工具吗?
我有一个简单的构建系统,用于我使用SCons放在一起的项目.该项目有很多源文件,我认为随着构建的进展,显示某种进度信息对用户友好.SCons提供CXXCOMSTR了我可以覆盖的构造变量,以控制在每个构建步骤期间显示给终端的内容.例如,而不是看到像:
gcc file.c -o file.o
Run Code Online (Sandbox Code Playgroud)
有这样的东西会很高兴:
[1/10] Compiling file.c: `gcc file.c -o file.o`
Run Code Online (Sandbox Code Playgroud)
其中[1/10]指定这是在此构建期间正在更新的十个目标中的第一个.有没有办法访问这些信息,以便我可以生成这样的消息?看起来我需要知道正在更新的目标总数(这是基于SCons所做的依赖性扫描)和一些枚举每个目标的方法.我知道类似的行为类似于其他构建系统,如CMake和waf,但在SCons(扩展)文档中没有遇到过任何问题.
我应该如何更改 SConstruct 才能查看每个文件编译方式的详细信息?
目前,scons 只输出一堆“compiling xxx.c ...”。
scons ×10
python ×4
c ×1
distutils ×1
environment ×1
include ×1
makefile ×1
path ×1
visual-c++ ×1