Building and Linking with Libraries

SCons User Guide 0.98.0
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 /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.

## 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 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, 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 /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.

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