Creazione di librerie condivise in Unix con GCC
Una libreria condivisa (Shared Library) è un file binario contenente un insieme di funzioni richiamabili o classi.
Esse hanno un nome particolare, detto soname, composto dalle lettere iniziali lib, dal nome della libreria, da .so, da un punto e dal numero della versione.
Supponiamo di avere i file:
File mymath.h
int add(int,int); int mul(int,int);
File mymath.cpp
int add(int x, int y) { return x+y; } int mul(int x, int y) { return x*y; }
e di voler creare una libreria condivisa.
Creiamo la libreria con:
g++ -c -fPIC mymath.cpp g++ -shared mymath.o -o libmymath.so
utilizzando -fPIC per abilitare la generazione di codice non dipendente dalla posizione (Position Indipendent Code).
Installiamo ora la libreria:
cp libmymath.so /usr/local/lib/ cp mymath.h /usr/local/include/
e vediamo come utilizzarla.
File main.cpp
#include <iostream> #include <mymath.h> int main() { std::cout << add(3,9) << std::endl; std::cout << mul(2,3) << std::endl; }
Non rimane che compilare il programma:
g++ main.cpp -o main -lmymath
Il seguente script crea una libreria condivisa e la installa o rimuove:
#!/bin/bash command=$1 filename=$2 if [ $# -ne 2 ] then echo "Usage: ./lib.sh <[gcc|g++|install|remove]> <filename>" exit 1 fi if [ $command == "gcc" -o $command == "g++" ] then $command -fPIC -c "$filename".cpp && \ $command -shared "$filename".o -o lib"$filename".so rm "$filename".o elif [ $command == "install" ] then echo Copying "$filename".h to /usr/local/include... cp "$filename".h /usr/local/include/ echo Moving lib"$filename".so to /usr/local/lib... mv lib"$filename".so /usr/local/lib/ elif [ $command == "remove" ] then echo Removing "$filename".h from /usr/local/include... rm /usr/local/include/"$filename".h echo Removing lib"$filename".so from /usr/local/include rm /usr/local/lib/lib"$filename".so fi
Sempre in riferimento all’esempio precedente, per utilizzare questo script bisogna posizionarsi nella cartella dove sono collocati i file mymath.h e mymath.cpp e dare il comando:
./lib.sh gcc mymath ./lib.sh install mymath
A quel punto, tutti i programmi che utilizzerano le funzioni definite in mymath.h potranno essere compilati, ad esempio, con:
g++ main.cpp -o main -lmymath