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