web-dev-qa-db-fra.com

Comment compiler une bibliothèque statique sous Linux?

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.

123

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.

190
Matthew Flaschen

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éalable
  • ar - 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'archive
    • c - crée une archive si elle n'existe pas déjà
    • s - crée un index de fichier objet dans l'archive

Pour 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 */
76
Alex44

Générez les fichiers objets avec gcc, puis utilisez ar pour les regrouper dans une bibliothèque statique.

9