Question: Guys, would you describe a few things about c++ building blocks, on unix. 

I want to create an application that links against static libs and dynamic libs (.so). 

**Question 1:** *How do I create static library using gcc/g++ ?How do I make my app link against it.*

**Question 2:** *How to specify it in the makefile, linking against static and dynamic libs, assuming that both libraries have header files*

Summary: I have been using makefiles and libraries for years, written by someone else. Thus every time I modified it, I simply cut-and-pasted things around, without really understanding it. Now I want to get down to the ground and understand the building/linking/Creating Makfile process in-depth.

*What is a good book describing these concepts in intimate details?*

Thanks

Answer: 
Static libraries are usually *archived* with the `ar` command. Once you build all of the object files (preferably with the `-fPIC` switch on GCC), you can run `ar` like so:

```
ar -rs archivename.a list.o of.o objects.o

```

The `man` page describes the options.

Dynamic libraries are built usually with the `-shared` switch to `gcc` or `ld` and the output file name with a `.so` extension.

Autotools handles this with the `libtool` program. I'm not familiar with its use.

Linking against these libraries can be done either by listing the libraries with the `-l` (ell) switch (such as `-lX` to link to `libX.so`) or by specifying them directly with absolute paths (such as adding `/usr/lib/libX.so` to your command). Static libraries are linked by specifying `-static` before `-l` or the appropriate absolute path to the `.a` archive.
Bare bones Makefile for creating a static library consisting of the code in foo.cpp, bar.cpp:

```
PROJECT = library.a
OBJECTS = foo.o bar.o
CFLAGS  = -Wall -pedantic

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS)
        libtool -o $(PROJECT) -static $(OBJECTS)

```

Bare bones Makefile for an app baz.cpp that static links to library.a:

```
PROJECT = baz
CFLAGS  = -Wall -pedantic
OBJECTS = baz.o

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS) library.a
        g++ $(OBJECTS) -L. -llibrary -o $(PROJECT)

```

Dynamic library left, ahem, as an exercise to the reader.