chapter 4. building and linking with libraries
=====
在大型的软件中,用库来管理十分方便,也可以为代码复用省不少事。
4.1 building libraries
=====
像 Program 函数一样,只需要调用 Library 函数就能生成库了。
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
% scons -Q
cc -o f1.o -c f1.c
cc -o f2.o -c f2.c
cc -o f3.o -c f3.c
ar rc libfoo.a f1.o f2.o f3.o
ranlib libfoo.a
除了从源码生成库,还可以从.o 文件生成库。
Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o'])
% scons -Q
cc -o f1.o -c f1.c
cc -o f3.o -c f3.c
ar rc libfoo.a f1.o f2.o f3.o f4.o
ranlib libfoo.a
默认生成的是静态库,也可以显示的指定生成静态库。
StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
也可以指定生成动态库
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
% scons -Q
cc -o f1.os -c f1.c
cc -o f2.os -c f2.c
cc -o f3.os -c f3.c
cc -o libfoo.so -shared f1.os f2.os f3.os
4.2 linking with libraries
=====
在使用 Program 编译时,用 $LIBS 指定库名称,用 $LIBPATH 指定库的路径。
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.')
我们不用显示的指定库的前缀和后缀,这些 SCons 会自动给我们做好了。
% scons -Q
cc -o f1.o -c f1.c
cc -o f2.o -c f2.c
cc -o f3.o -c f3.c
ar rc libfoo.a f1.o f2.o f3.o
ranlib libfoo.a
cc -o prog.o -c prog.c
cc -o prog prog.o -L. -lfoo -lbar
可以看到,-L.,SCons自动生成了flags。
转载于:https://www.cnblogs.com/lyyyuna/archive/2013/04/22/4123905.html