05 SCons 编译库

先看基本语法

# 编译生成foo库
Library('foo', ['f1.c' , 'f2.c' , 'f3.c'])
 
# 也可以从源代码或目标文件来编译生成库,前提是Object文件得存在
Library('foo', ['f1.c' , 'f2.o' , 'f3.c' , 'f4.o'])
 
# 显示指定编译静态库或动态库,构造函数会根据当前系统来生成不同的库格式
#动态库 类linux系统下格式: .so   windows系统下格式: .dll
#静态库 类linux系统下格式: .a    windows系统下格式: .lib
#编译生成静态库
StaticLibrary('foo' , ['f1.c' , 'f2.c' , 'f3.c'])
#编译生成动态库
SharedLibrary('foo' , ['f1.c' , 'f2.c' , 'f3.c'])
 
# 生成的库最终会提供给其它源代码使用,如何把库和我们现有的目标文件链接在一起
# 可以在构造文件中编译库和编译程序放在一起
# 也可以在其它地方提前编译好,然后再编译程序的时候引用它
# $LIBS和$LIBPATH 是scons的构造变量,$LIBS 指定库的名字,注意不需要后缀,scons会根据当前系统来选择
# $LIBPATH 是查找库的路径的scons构造变量,可以是绝对路径或相对路径,推荐使用相对路径
Library('foo', ['f1.c' , 'f2.c' , 'f3.c'])
Program('prog.c', LIBS=['foo' , 'bar'] , LIBPATH='.')
 
# 如果我们的库只有一个,我们可以使用字符串类型来替换列表类型
# python中字符串是'' 或"",列表是[]
Program('prog.c' , LIBS='foo' , LIBPATH='.')
 
# $LIBPATH 库查找路径推荐放在列表中,这样可以跨平台。但是当使用字符串类型来表示路径时,格式使用本地方式。
# linux中路径分隔符是'/'。windows中路径分隔符是'\',字符串中要使用转义字符'\\'
 
#跨平台方式 []
Program('prog' , LIBS='m' , 
                            LIBPATH =['/usr/lib' , '/usr/local/lib' , './lib'])
#linux平台方式 ''
LIBPATH = '/usr/lib:/usr/local/lib:./lib'
 
#windows平台方式 ''
LIBPATH = 'C:\\lib;D:\\lib;.\\lib'

一个例子:

在helloworld文件夹下创建f1.c f2.c f3.c hello.c Sconstruct 5个文件

f1.c f2.c f3.c 用来编译生成静态库foo

hello.c 是测试代码,引用foo库中的函数

f1.c:
#include <stdio.h>

void f1_print(void)
{
    printf("i am file1\n");
}
f2.c:
#include <stdio.h>

void f2_print(void)
{
    printf("i am file2\n");
}
f3.c:
#include <stdio.h>

void f3_print(void)
{
    printf("i am file3\n");
}
hello.c:
#include <stdio.h>

extern void f1_print(void);
extern void f2_print(void);
extern void f3_print(void);

void main(void)
{
    printf("hello,world\n");
    
    printf("call file1\n");
    f1_print();
    
    printf("call file2\n");
    f2_print();
    
    printf("call file3\n");
    f3_print();  
}
SConstruct 文件:

Library('foo' , ['f1.c' , 'f2.c' , 'f3.c'])
# 注意 LIBS=[] 列表中库的名字不要加前缀lib,也不要加后缀!!
Program('prog', 'hello.c' , LIBS=['foo'] , LIBPATH='.')

打开终端,具体操作参考本系列之前文章

输入:scons

如下图:

扩展:

我把Sconstruct 文件中的函数顺序调整一下:

SConstruct文件

Program('prog', 'hello.c' , LIBS=['foo'] , LIBPATH='.')
Library('foo' , ['f1.c' , 'f2.c' , 'f3.c'])

把Program() 编译生成执行程序放在Library()前面。

终端执行:scons-c 清除

在执行:scons 或scons -Q

最终编译结果和运行结果和之前一致。

这里也验证了前面文章说的 Sconstruct 文件中的方法调用和最终的执行任务是不同步的。

所以在方法调用上也是没有顺序的,编译任务的执行顺序和时间由SCons自己决定。我们只要调用方法指定规则就好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懂IT的嵌入式工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值