实例目录结构:
- include文件夹:test.h
- src文件夹:test.c
- SConscript
- SConstruct
如下图所示:
SConstruct:
#执行当前目录下的SConscript
SConscript('SConscript');
SConscript:
import os
from SCons.Script import *
# 设置编译环境
env = Environment()
#这样指定提示找不到编译器路径,需要绝对路径
#env['CC'] = 'arm-none-eabi-gcc'
#指定C编译器
env['CC'] = '/home/work/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc'
#设置CFLAGS
env['CFLAGS'] = ' -mfpu=neon-vfpv4 -mtune=cortex-a7 -march=armv7-a -mfloat-abi=softfp -O2 -Wall'
#指定C++编译器
env['CXX'] = '/home/work/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-g++'
#指定CXX FLAG
env['CXXFLAGS'] = env['CFLAGS'] + ' -Woverloaded-virtual -fno-exceptions -fno-rtti -std=c++11 -fexceptions'
#设置需要编译成库的文件
sources = [Glob('src/*.c') + Glob('src/*.c++')];
# 头文件搜索路径
include_dirs = [os.getcwd() + '/include']
# 添加头文件搜索路径
env.Append(CPPPATH=include_dirs)
#设置目标库的名字以及依赖的文件
lib = env.StaticLibrary("test", [sources])
# 设置默认构建目标为静态库
Default(lib)
# 构建目标
env.Alias('all', lib)
env.Default(lib)
直接在SConstruct文件所在目录下执行scons命令即可编译,会在src目录下生成libtest.a。比较奇怪的是,在命令行中直接执行arm-none-eabi-gcc -v是可以打印这个交叉编译编译工具链的信息的,证明工具链添加到环境变量中是没有问题的,但是Sconscript脚本中直接这样写env[‘CC’] = ‘arm-none-eabi-gcc’,会提示找不到编译工具链,需要编译工具链的绝对路径。看样子是Scons不会共用系统的环境变量,有知道的同学请留言指导下哈!