scons是一个Python写的自动化构建工具,可以用来编译代码,和make作用相似
1、安装python
sudo apt-get install python3
sudo apt-get install python3-pip
2、更改python软连接,将python3配置为python默认版本
cd /usr/bin
sudo rm python
sudo ln -s python3 python
执行完后通过python -V确认链接的是python3
3、更新pip程序
pip3 install pip
安装完成后通过pip3 -V查看版本
4、安装scons
sudo python -m pip install scons
安装完成后通过scons -v查看版本
5、编译一个简单的hello world程序
int main(int argc, char **argv)
{
printf("hello world!\n");
return 0;
}
在工程目录下建立一个SConstruct文本文件
import os
#获取当前目录下的所有.c文件,保存在src变量中
src = Glob('*.c')
#获取环境变量
env = Environment()
env.Append(CCCOMSTR="CC $SOURCES")
env.Append(LINKCOMSTR="LINK $TARGET")
#将.c编译成.o文件
objs = env.Object(src)
#编译出可执行程序,程序的目标是proj_test
env.Program(target = 'proj_test',source=objs)
6、打开终端,切换到工程目录下
执行scons
执行后会编译出proj_test可执行程序
指向scons -c 可以清除编译出来的文件,相当于make clean
7、多目录源文件编译
test
|-- main.c
|-- SConstruct
| model(目录)
|-- common_utils.h
|-- common_utils.c
|-- SConscript
main.c
#include <stdio.h>
#include <string.h>
#include "model/common_utils.h"
int main(int argc, char **argv)
{
int ret = utils_atoi("10086");
printf(">>>>>> ret = %d\n",ret);
return 0;
}
SConstruct
import os
#获取环境变量
env = Environment()
env.Append(CCCOMSTR="CC $SOURCES")
env.Append(LINKCOMSTR="LINK $TARGET")
#获取当前目录下的所有.c文件
src = Glob('*.c')
#将model 目录下的.c添加进来,其实是执行SConscript
src += SConscript(os.path.join('model', 'SConscript'),variant_dir='build/model', duplicate=0)
#将.c编译成.o文件
objs = env.Object(src)
#编译出可执行程序,程序的目标是proj_test
env.Program(target = 'proj_test',source=objs)
common_utils.h
int utils_atoi(const char* str);
common_utils.c
#include "common_utils.h"
int utils_atoi(const char* str)
{
int ret = 0;
const char* temp = str;
char is_negative = 0;
if(*temp=='-')
{
is_negative = 1;
temp++;
}
else if(*temp=='+')
{
temp++;
}
while(*temp>='0'&&*temp<='9')
{
ret =ret*10+(*temp-'0');
temp++;
}
return is_negative?-ret:ret;
}
SConscript
import os
#获取环境变量
env = Environment()
include_dirs = []
defines = []
env.Append(CPPPATH = include_dirs)
env.Append(CPPDEFINES = defines)
#获取当前目录下的所有.c文件
src = Glob('*.c')
Return('src')
执行scons 后即可编译出对应的可执行程序