SCons上手教程

SCons基础教程

23.12.1.-11


本文回答以下三个问题:

  • 如何使用scons编译hello world?
  • 使用scons如何编译静态库、动态库、.o和elf/exe?
  • 如何使用scons组织文件夹,实现多级自治?

参考

  1. scons user guide
  2. scons man

1. Hello World编译

首先建立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,下图是运行结果
在这里插入图片描述

2. 生成不同类型镜像

scons可以用来编译 .o/.a/.so/.elf等常见的不同镜像文件。需要使用以下几个内建Builder. 使用时,只需要按照函数调用即可。

更加具体内容可以参考 scons manBuilder Methods小节;以及scons user guide中4.1.1. Building Libraries From Source Code or Object Files小节。

  1. Program,生成可执行文件即elf
  2. Object,只生成.o
  3. Library/StaticLibrary,生成静态库 libxxx.a
  4. SharedLibrary, 生成.so

3. 如何实现层次化编译

按照Makefile的使用习惯,各个文件夹可以有自己的Makefile用于管理这个文件夹下的源文件等,scons也实现了这一功能。可以调用sconscript方法,调用之后,scons执行时按照一定的规则去搜索子路径下的Sconscript文件,从而实现多级有机自治。
关于这一部分,可以详细参考Scons UG: Chapter 14. Hierarchical Builds.

3.1 目标

考虑如下一个目录结构,希望将mod下的所有.c一起编译成为libmod.a,将main下的所有.c编译成为一组.o,最后在主目录下生成可执行文件。

.
├── main
│   └── main.c
├── mod
│   ├── hello1.c
│   └── hello2.c
└── Sconstruct
3.2 文件内容

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");
}
3.3 如何组织

需要在项目目录下建立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'])

下图是编译运行结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值