03. Static and Shared Libraries
Static and Shared Libraries
Simple application
The 'hello.c' listing:
#include <stdio.h> #include <stdlib.h> int main() { printf("Hello World\n"); exit(0); }
To compile, execute this:
gcc hello.c -o hello
To run, execute this:
./hello
Static and shared libraries
- Static - .a extension
- Shared - .so extension
Names of libraries start with the 'lib' prefix.
To see the full list of libs in the system, execute the command:
ls /usr/lib | less
To list of libraries loaded by application, use the ldd command. For example:
ldd "$(which ls)"
Static libraries
Use mcedit to create the fred.c and bill.c files.
fred.c:
mcedit fred.c #include <stdio.h> void fred(int arg) { printf("fred: you passed %d\n", arg); }
bill.c:
mcedit bill.c #include <stdio.h> void bill(char *arg) { printf("bill: you passed %s\n", arg); }
Compile the sources into object files:
gcc -c fred.c bill.c
See the object files:
ls *.o bill.o fred.o
Make a static library (archive):
ar crv libfoo.a bill.o fred.o r - bill.o r - fred.o
Write the header file for the library:
lib.h:
mcedit lib.h void bill(char *); void fred(int);
Write a program that uses the library:
program.c:
mcedit program.c #include <stdlib.h> #include "lib.h" int main() { bill("Hello World!"); exit(0); }
Build the program object file:
gcc -c program.c
Build a program from object files:
gcc -o program program.o bill.o
Build a program that used the static library:
gcc -o program program.o -L. -lfoo
Shared libraries
Compile sources into position-independent code (PIC):
gcc -c -Wall -fPIC fred.c bill.c
Build shared library from object files:
gcc -shared -o libfoo.so fred.o bill.o
Build the program that uses the shared library:
gcc -Wall -o program program.c -lfoo -L.
Run the program:
export LD_LIBRARY_PATH=. ./program
See loaded libraries:
ldd ./program