我最近开始使用scons构建几个小型跨平台项目.其中一个项目需要链接到预先构建的静态库......这是如何完成的?
在make中,我只是在windows上追加"link/LIBPATH:libstxxl.lib",在unix上追加"stxxl.a".
简单的问题.是否有任何工具可以从命令行生成Xcode项目?我们使用SCons构建我们的跨平台应用程序,但这不支持内在的Xcode项目生成.我们希望避免手动创建项目,因为这将涉及维护多个文件列表.
是否有任何工具可以将大型复杂的*Visual Studio 2005(或2008)解决方案转换为SCons项目?
*多个平台/编译器上的大量项目和多种配置
我正在使用scons实用程序生成共享库.当我写下面的规则时:
SharedLibrary('hello','hello.c')
我会得到``libhello.so''文件.
有没有办法自动获取像``libhello.so.version'这样的文件?
我很难控制何时在scons中构建文件.我有一个非常简单的构建树示例(见下文),其中一个Poem构建器只接受一个.txt文件并将其转换为相应.eectxt文件中的小写.
在我的SConstruct和SConscript文件中,我声明了3个.txt文件的依赖项.
但我无法弄清楚是什么将这些放入默认构建中!
sconstest/
SConstruct
tiger.txt
src/
SConscript
hope.txt
jabberwocky.txt
Run Code Online (Sandbox Code Playgroud)
其中*.txt文件是诗歌,我的SConstruct和SConscript看起来像这样:
SConstruct:
env = Environment();
def eecummings(target, source, env):
if (len(target) == 1 and len(source) == 1):
with open(str(source[0]), 'r') as fin:
with open(str(target[0]), 'w') as fout:
for line in fin:
fout.write(line.lower());
return None
env['BUILDERS']['Poem'] = Builder(action=eecummings, suffix='.eectxt', src_suffix='.txt');
Export('env');
poems = SConscript('src/SConscript');
tigerPoem = env.Poem('tiger.txt');
Run Code Online (Sandbox Code Playgroud)
SRC/SConscript:
Import('env');
input = ['jabberwocky.txt', 'hope.txt'];
output = [env.Poem(x) for x in input];
Return('output');
Run Code Online (Sandbox Code Playgroud)
我想要做的是声明.eectxt文件与相应.txt …
我有一个用Scons构建的C++项目.起初我只有优化版本才能编译,它运行正常.然后我还需要一个调试版本,然后我为它添加另一个环境.这是Scons代码:
env = Environment()
opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall'])
opt_objs = opt.Glob('src/*.cpp')
prog = opt.Program('prog', opt_objs)
dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0'])
dbg_objs = dbg.Glob('src/*.cpp')
dbg_prog = dbg.Program('dbg_prog', dbg_objs)
Run Code Online (Sandbox Code Playgroud)
使用此代码,我遇到了错误:
scons: *** Two environments with different actions were specified for the same target:
src/CometReadService.o
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,由opt.Glob('src/.cpp')和dbg.Glob('src / .cpp')创建的那些.o文件目标完全相同.通过阅读文档Multiple Construction Environments我知道我可以将对象重命名为"opt.Object('xxx-opt','xxx.c')",但是,它是Glob而不是Object.我怎么解决这个问题?
我写的东西像C++的互动教程.本教程将由两部分组成:一部分编译成一个库(我使用Scons构建它),另一部分(课程)随最终用户编译的教程一起提供.我正在寻找一种方便人们建立这些课程的好方法.
基本上,第二部分是一个包含所有课程的目录,每个目录都在自己的目录中.每课至少有一个lesson.cpp和main.cpp文件,还可以存在其他文件,其中存在的我不知道,直到它被运后-最终用户将创建这些.它看起来像这样:
all_lessons/
helloworld/
lesson.cpp
main.cpp
even_or_odd/
lesson.cpp
main.cpp
calculator/
lesson.cpp
main.cpp
user_created_add.cpp
Run Code Online (Sandbox Code Playgroud)
这些中的每一个都需要根据几乎相同的规则进行编译,并且编译命令应该可以从其中一个课程目录(helloworld/等等)运行.
看到项目的其余部分是使用Scons构建的,因此将它用于此部分也是有意义的.然而,使用SCons将搜索SConstruct它从运行目录下的文件:这是可以接受的把SConstruct每节课目录中的文件,再加上一个SConscript在all_lessons/给出的一般规则目录?这似乎违背了Scons期望项目组织的典型方式:这种方法的潜在缺陷是什么?我可以放一个SConstruct文件而不是SConscript文件,从而可以从任一目录构建(使用导出来避免无休止的递归,我猜)?
另外,我可能在某一时刻要替换lesson.cpp一个lesson.py生成所需的文件; Scons是否允许我轻松地与构建者一起完成这项工作,或者是否有一个更方便的框架?
最后,我想最终得到以下内容(或具有不同构建系统的等效内容):
all_lessons/
SConstruct
helloworld/
SConstruct
lesson.cpp
main.cpp
even_or_odd/
SConstruct
lesson.py
main.cpp
calculator/
SConstruct
lesson.cpp
main.cpp
user_created_add.cpp
Run Code Online (Sandbox Code Playgroud)
scons all在all_lessons目录中运行需要:
even_or_odd/lesson.py生成even_or_odd/lesson.cpp.user_created_add.cpp还需要编译.运行scons中even_or_odd/,或者scons even_or_odd在all_lessons/应该产生一个可执行与上面的一个(相同的编译标志).
摘要:
我正在尝试修改我的SCons文件,以便将生成的文件放入构建目录中.最初我虽然VariantDir可能是一个选项,但从我阅读的所有内容和示例来看,它并没有做我想要的.
有没有简单的方法强制SCons将输出放在某个目录中而不必重写所有的源和脚本?
我试图在自动编译后将生成的程序文件复制到父目录.
我尝试过这个,但这不起作用.
env.Program( "program_name", [ "file1.cc", "file2.cc" ] )
Copy( "../program_name", "program_name" )
Run Code Online (Sandbox Code Playgroud)
我怎么能用SCons做到这一点?
我的项目使用SCons来管理构建过程.我想支持多个编译器,所以我决定使用,AddOption这样用户就可以在命令行中指定使用哪个编译器(默认情况下是当前编译器所用的编译器).
AddOption('--compiler', dest = 'compiler', type = 'string', action = 'store', default = DefaultEnvironment()['CXX'], help = 'Name of the compiler to use.')
Run Code Online (Sandbox Code Playgroud)
我希望能够为各种编译器提供内置的编译器设置(包括特定编译器的最大警告级别等).这是我目前首次尝试解决方案的方式:
if is_compiler('g++'):
from build_scripts.gcc.std import cxx_std
from build_scripts.gcc.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.gcc.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
elif is_compiler('clang++'):
from build_scripts.clang.std import cxx_std
from build_scripts.clang.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.clang.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
Run Code Online (Sandbox Code Playgroud)
但是,我不确定该is_compiler()功能是什么样的.我的第一个想法是直接比较编译器名称(例如'clang ++')与用户传入的内容.但是,当我尝试使用时,这立即失败了scons --compiler=~/data/llvm-3.1-obj/Release+Asserts/bin/clang++.
所以我觉得我会变得更聪明并且使用这个功能
cxx = GetOption('compiler')
def is_compiler (compiler):
return cxx[-len(compiler):] == compiler
Run Code Online (Sandbox Code Playgroud)
这只会查看编译器字符串的结尾,以便忽略目录.不幸的是,'clang …