Scons学习笔记

1.    scons安装:Suse 10 Linux 缺省已经安装,在任何目录下键入scons即可;

2.    scons将在当前目录下按以下次序SConstruct / Sconstruct / sconstruct来搜索脚本文件;

3.    最简单的只一行如下,Program是scons的一个方法(method),表示编译链接可执行文件;

Program(‘hello.c’)

4.    Object方法表示编译一个.o文件

5.    scons还可以编译Java程序,方法名就是Java;

6.    清除已编译的内容:scons -c或 scons --clean;

7.    SConstruct文件就是一个Python脚本,可理解为一个Python程序的入口(对应的makefile则更像一个配置文件);

8.    与Python语法一样,注释语句由‘#’带出;

9.    scons中的方法(Program / Object / Java等)的执行与其在脚本中的位置无关(order independent),而是由scons根据依赖关系自行决定;我猜测其原因是参照make/makefile机制,先写最终的链接目标,而实际需要先编译.o

10.  scons -Q忽略编译链接前后的读文件、编译结束的提示,聚焦编译链接的动作提示;

11.  Program(’new_hello’, ’hello.c’),new_hello可执行文件名。

12.  多个源程序的编译链接,可使用Python中的list(类似数组):Program(’program’, [’main.c’, ’file1.c’, ’file2.c’])

13.  以下脚本中,Split是scons的函数,用于生成一个list,target/source是scons的关键字。

list = Split(’main.c file1.c file2.c’)

Program(target = ’program’, source = list)

14.  Library,做库的方法,缺省生成.a的静态库;语法和Program一样;Library = StaticLibrary;

15.  与scons无关:linux下ar(archive,归档的意思)命令做库,ranlib为库文件(archive)生成索引(index),即符号表。nm -s / nm --print-armap命令可以打印符号表(nm 大约是name map的意思);

16.  SharedLibrary生成.so库,语法和Program一样;

17.  LIBS指定库List,LIBPATH指定库所在的路径。LIBS中的文件可以没有扩展名,scons会自动找到合适的文件。如下所示

Program(’prog.c’, LIBS=[’foo’, ’bar’], LIBPATH=’.’)

18.  LIBPATH可以是一个Python List也可以是Linux的冒号(:)分割的单个字符串(windows下用分号分割)如下

LIBPATH = ’/usr/lib:/usr/local/lib’    #for Linux OS

LIBPATH = ’C:\\lib;D:\\lib’            #for Windows OS

19.  对照下面两端脚本,可体会交叉编译的技巧

Object(’hello.c’, CCFLAGS=’-DHELLO’)

Object(’goodbye.c’, CCFLAGS=’-DGOODBYE’)

Program([’hello.o’, ’goodbye.o’])

 

hello_list = Object(’hello.c’, CCFLAGS=’-DHELLO’)

goodbye_list = Object(’goodbye.c’, CCFLAGS=’-DGOODBYE’)

Program(hello_list + goodbye_list)

 

20.  Environment方法输出指定的编译链接环境

env = Environment(CC = ’gcc’,

CCFLAGS = ’-O2’)

env.Program(’foo.c’)

21.  多环境编译举例

opt = Environment(CCFLAGS = ’-O2’)

dbg = Environment(CCFLAGS = ’-g’)

o = opt.Object(’foo-opt’, ’foo.c’)

opt.Program(o)

d = dbg.Object(’foo-dbg’, ’foo.c’)

dbg.Program(d)

 

22.  Clone方法举例

env = Environment(CC = ’gcc’)

opt = env.Clone(CCFLAGS = ’-O2’)

dbg = env.Clone(CCFLAGS = ’-g’)

env.Program(’foo’, ’foo.c’)

o = opt.Object(’foo-opt’, ’foo.c’)

opt.Program(o)

d = dbg.Object(’foo-dbg’, ’foo.c’)

dbg.Program(d)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值