Friday 12 September 2008

Linux library types

Copied from yolinux.

.a Static library, the contents become part of the compiled executable.

.so Dynamically linked shared object library. Do not become part of the executable but must be present at run-time.


How to generate a static library (.a)
Compile: cc -Wall -c ctest1.c ctest2.c

Compiler options:
-Wall: include warnings. See man page for warnings specified.

Create library "libctest.a": ar -cvq libctest.a ctest1.o ctest2.o

List files in library: ar -t libctest.a

Linking with the library:
cc -o executable-name prog.c libctest.a
cc -o executable-name prog.c -L/path/to/library-directory -lctest


How to generate a dynamically linked shared object library: .so

Create object code

gcc -Wall -fPIC -c *.c


Create library

gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o


Optional: create default version using symbolic link

mv libctest.so.1.0 /usr/lib
ln -sf /usr/lib/libctest.so.1.0 /usr/lib/libctest.so
ln -sf /usr/lib/libctest.so.1.0 /usr/lib/libctest.so.1


Compiler options:

-Wall: include warnings. See man page for warnings specified.

-fPIC: Compiler directive to output position independent code, a characteristic required by shared libraries. Also see "-fpic".

-shared: Produce a shared object which can then be linked with other objects to form an executable.

-W1: Pass options to linker.
In this example the options to be passed on to the linker are: "-soname libctest.so.1". The name passed with the "-o" option is passed to gcc.

Option -o: Output of operation. In this case the name of the shared object to be output will be "libctest.so.1.0"


Library Links:

The link to /usr/lib/libctest.so allows the naming convention for the compile flag -lctest to work.
The link to /usr/lib/libctest.so.1 allows the run time binding to work. See dependency below.


Compiling for runtime linking with a dynamically linked libctest.so.1.0:

gcc -Wall -I/path/to/include-files -L/path/to/libraries prog.c -lctest -o prog

Use:
gcc -Wall -L/opt/lib prog.c -lctest -o prog
Where the name of the library is libctest.so. (This is why you must create the symbolic links or you will get the error "/usr/bin/ld: cannot find -lctest".)
The libraries will NOT be included in the executable but will be dynamically linked during runtime execution.


The shared library dependencies of the executable can be listed with the command: ldd name-of-executable

No comments: