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 suis pas tout à fait familier avec gcc, j'espère que n'importe qui peut me donner un coup de main.

111
demandé sur peterh 2010-04-29 08:06:18

3 réponses

Voir créer 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 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 la page de manuel pour plus d'informations.

169
répondu Matthew Flaschen 2010-04-29 04:10:25

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)

Expliquer le makefile:

  • target: prerequisites - la tête de la règle
  • $@ - désigne la cible
  • $^ - signifie Toutes les conditions préalables
  • $< - signifie Juste la première condition 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 - remplacer fichiers existant dans l'archive
    • c - créer une archive si elle n'existe pas déjà
    • s - créer 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 de l'objet.

Principal.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 libs

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

#include "lib1.h"
#include "lib2.h"

#endif

Lib1.c première lib source

#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 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 */
64
répondu Alex44 2018-03-04 12:14:58

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

9
répondu Ignacio Vazquez-Abrams 2010-04-29 04:10:44