赞
踩
23.12.1.-11
本文回答以下三个问题:
参考
首先建立main.c 和 Sconstruct两个文件
//main.c
#include <stdio.h>
int main()
{
printf("hello world with scons building\n");
return 0;
}
Sconstruct文件只用调用Scons的内建函数Program即可,不需要import任何文件。然后使用scons进行编译
# Sconstruct
Program('main.c')
执行scons命令后,会在执行目录下生成main,下图是运行结果
scons可以用来编译 .o/.a/.so/.elf等常见的不同镜像文件。需要使用以下几个内建Builder. 使用时,只需要按照函数调用即可。
更加具体内容可以参考 scons man中Builder Methods小节;以及scons user guide中4.1.1. Building Libraries From Source Code or Object Files小节。
按照Makefile的使用习惯,各个文件夹可以有自己的Makefile用于管理这个文件夹下的源文件等,scons也实现了这一功能。可以调用sconscript方法,调用之后,scons执行时按照一定的规则去搜索子路径下的Sconscript文件,从而实现多级有机自治。
关于这一部分,可以详细参考Scons UG: Chapter 14. Hierarchical Builds.
考虑如下一个目录结构,希望将mod下的所有.c一起编译成为libmod.a,将main下的所有.c编译成为一组.o,最后在主目录下生成可执行文件。
.
├── main
│ └── main.c
├── mod
│ ├── hello1.c
│ └── hello2.c
└── Sconstruct
main.c
#include <stdio.h>
void hello1();
void hello2();
int main()
{
hello1();
hello2();
printf("hello main\n");
return 0;
}
hello1.c/hello2.c
//hello1.c
#include <stdio.h>
void hello()
{
printf("hello1\n");
}
需要在项目目录下建立Sconsctruct,在两个目标目录下建立各自的Sconscript,然后在各自的Sconscript文件中编译.o或者.a,最后在顶层建立Sconstruct文件,作为scons工具的入口。
.
├── main
│ ├── main.c
│ └── Sconscript
├── mod
│ ├── hello1.c
│ ├── hello2.c
│ └── Sconscript
└── Sconstruct
两个Sconscript文件分别如下,自行区分
env = Environment()
print("script under main")
env.Object('main',['main.c'])
env = Environment()
print("script under mod")
env.Library('hello',['hello1.c','hello2.c'])
顶层Sconsctruct如下
SConscript(['main/Sconscript',
'mod/Sconscript'])
# 指定生成proc.elf
# 指定需要的.o
# 指定需要的库和路径
Program('proc','main/main.o',LIBS=['hello'],LIBPATH=['mod'])
下图是编译运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。