SCons User Guide 1.2.0.d20100117 | ||
---|---|---|
<<< Previous | Next >>> |
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.
You build your own libraries by specifying Library instead of Program:
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 /Fof1.obj /c f1.c /nologo cl /Fof2.obj /c f2.c /nologo cl /Fof3.obj /c f3.c /nologo 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.
The previous example shows building a library from a list of source files. You can, however, also give the Library call object files, and it will correctly realize In fact, you can arbitrarily mix source code files and object files in the source list:
Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o']) |
And SCons realizes that only the source code files must be compiled into object files before creating the final library:
% 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 |
Of course, in this example, the object files must already exist for the build to succeed. See the Chapter called Node Objects, below, for information about how you can build object files explicitly and include the built files in a library.
The Library function builds a traditional static library. If you want to be explicit about the type of library being built, you can use the synonym StaticLibrary function instead of Library:
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 /Fof1.obj /c f1.c /nologo cl /Fof2.obj /c f2.c /nologo cl /Fof3.obj /c f3.c /nologo 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.
<<< Previous | Home | Next >>> |
Sharing Source Files Between Multiple Programs | Linking with Libraries |