For more information on shared libraries checkout - Creating and using shared libraries in Linux
Static libraries conventionally end with the ".a" suffix. They are useful for developers to link to their library, but don't want to give the library source code. Theoretically code in static ELF libraries that is linked into an executable should run slightly faster (by 1-5%) than a shared library or a dynamically loaded library, but in practice this rarely seems to be the case due to other confounding factors.
We use following source code files for this post.
calc_mean.c
double mean(double a, double b) { return (a+b) / 2; }calc_mean.h
double mean(double, double);main.c - We are including our static library in this application.
#include <stdio.h> #include "calc_mean.h" int main(int argc, char* argv[]) { double v1, v2, m; v1 = 5.2; v2 = 7.9; m = mean(v1, v2); printf("The mean of %3.2f and %3.2f is %3.2f\n", v1, v2, m); return 0; }Creating the static library
First we have to create object file for calc_mean.c
gcc -c calc_mean.c -o calc_mean.oThen, using archiver (ar) we produce a static library (named libmean.a) out of the object file calc_mean.o.
ar rcs libmean.a calc_mean.oNOTE: A static library must start with the three letters 'lib' and have the suffix '.a'.
Compiling main program and linking with static library
We have already created a static library libmean.a and now let us use the static library by invoking it as part of the compilation and linking process when creating a program executable. Incase of gcc we use following flags to create static library
- -llibrary searches for the library named library at the time of linking. Linker searches and processes libraries and object files in the order they are specified. Thus, ‘foo.o -lz bar.o’ searches library ‘z’ after file foo.o but before bar.o. If bar.o refers to functions in ‘z’, those functions may not be loaded. The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name.
- -L(path-to-the-library) Specifies the path in which the library file can be found. We can use -L. inorder to point to the current directory and -L/home/tmp to point to /home/tmp directory.
- -static On systems that support dynamic linking, this prevents linking with the shared libraries.
gcc -static main.c -L. -lmean -o mainNow run the executable program 'main'
$./main