Chapter 4. Building and Linking with Libraries
Prev |  | Next

## Chapter 4. Building and Linking with Libraries

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.

## 4.1. Building Libraries

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.

### 4.1.1. Building Libraries From Source Code or Object Files

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 they are object files. 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 Chapter 5, Node Objects, below, for information about how you can build object files explicitly and include the built files in a library.

### 4.1.2. Building Static Libraries Explicitly: the `StaticLibrary` Builder

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.

### 4.1.3. Building Shared (DLL) Libraries: the `SharedLibrary` Builder

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)
    embedManifestDllCheck(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.

Prev |  | Next
3.8. Sharing Source Files Between Multiple Programs | Home | 4.2. Linking with Libraries