J'ai une question: comment compiler une bibliothèque statique sous Linux avec gcc, c’est-à-dire que je dois compiler mon code source dans un fichier nommé out.a. Est-il suffisant de simplement compiler avec la commande gcc -o out.a out.c
? Je ne connais pas bien gcc, j'espère que tout le monde pourra me donner un coup de main.
Voir Création d'une bibliothèque partagée et statique avec le compilateur gnu [gcc]
gcc -c -o out.o out.c
-c
signifie créer un fichier d'objet intermédiaire plutôt qu'un exécutable.
ar rcs libout.a out.o
Cela crée la bibliothèque statique. r
signifie insérer avec remplacement, c
signifie créer une nouvelle archive et s
signifie écrire un index. Comme toujours, consultez le page de manuel pour plus d’informations.
Voici un exemple complet de makefile:
makefile
TARGET = prog
$(TARGET): main.o lib.a
gcc $^ -o $@
main.o: main.c
gcc -c $< -o $@
lib.a: lib1.o lib2.o
ar rcs $@ $^
lib1.o: lib1.c lib1.h
gcc -c -o $@ $<
lib2.o: lib2.c lib2.h
gcc -c -o $@ $<
clean:
rm -f *.o *.a $(TARGET)
expliquant le makefile:
target: prerequisites
- la tête de la règle$@
- signifie la cible$^
- signifie tous les préalables$<
- signifie seulement le premier préalablear
- un outil Linux pour créer, modifier et extraire des archives voir les pages de manuel pour plus d'informations . Les options dans ce cas signifient: r
- remplace les fichiers existants dans l'archivec
- crée une archive si elle n'existe pas déjàs
- crée un index de fichier objet dans l'archivePour conclure : La bibliothèque statique sous Linux n'est rien de plus qu'une archive de fichiers objets.
main.c en utilisant la lib
#include <stdio.h>
#include "lib.h"
int main ( void )
{
fun1(10);
fun2(10);
return 0;
}
lib.h l'en-tête principal de la bibliothèque
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED
#include "lib1.h"
#include "lib2.h"
#endif
lib1.c première source de lib
#include "lib1.h"
#include <stdio.h>
void fun1 ( int x )
{
printf("%i\n",x);
}
lib1.h l'en-tête correspondant
#ifndef LIB1_H_INCLUDED
#define LIB1_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun1 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB1_H_INCLUDED */
lib2.c deuxième source de lib
#include "lib2.h"
#include <stdio.h>
void fun2 ( int x )
{
printf("%i\n",2*x);
}
lib2.h l'en-tête correspondant
#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun2 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB2_H_INCLUDED */
Générez les fichiers objets avec gcc, puis utilisez ar
pour les regrouper dans une bibliothèque statique.