It's often useful to organize large software projects by collecting parts of the software into one or more libraries. SCons makes it easy to create libraries and to use them in the programs.
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
SCons uses the appropriate library prefix and suffix for your system. So on POSIX or Linux systems, the above example would build as follows (although ranlib may not be called on all systems):
% 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
On a Windows system, a build of the above example would look like:
C:\>scons -Q cl /nologo /c f1.c /Fof1.obj cl /nologo /c f2.c /Fof2.obj cl /nologo /c f3.c /Fof3.obj lib /nologo /OUT:foo.lib f1.obj f2.obj f3.obj
The rules for the target name of the library are similar to those for programs: if you don't explicitly specify a target library name, SCons will deduce one from the name of the first source file specified, and SCons will add an appropriate file prefix and suffix if you leave them off.
StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
There is no functional difference between the StaticLibrary and Library functions.
If you want to build a shared library (on POSIX systems) or a DLL file (on Windows systems), you use the SharedLibrary function:
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
The output on POSIX:
% 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
And the output on Windows:
C:\>scons -Q cl /nologo /c f1.c /Fof1.obj cl /nologo /c f2.c /Fof2.obj cl /nologo /c f3.c /Fof3.obj link /nologo /dll /out:foo.dll /implib:foo.lib f1.obj f2.obj f3.obj RegServerFunc(target, source, env)
Notice again that SCons takes care of building the output file correctly, adding the -shared option for a POSIX compilation, and the /dll option on Windows.