Comment compiler une bibliothèque statique sous Linux?

138

J'ai une question: Comment compiler une bibliothèque statique sous Linux avec gcc, c'est-à-dire que j'ai besoin de 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 pourra me donner un coup de main.

Summer_More_More_Tea
la source
vérifier ceci
Accountant م

Réponses:

90

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 règle
  • $@ - désigne la cible
  • $^ - signifie tous les prérequis
  • $< - signifie juste le premier prérequis
  • 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 les fichiers existants 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 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 libs

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c première source de la bibliothèque

#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 la bibliothèque

#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 */
Alex44
la source
cela aurait aidé à indiquer ce que font les commandes et ce qu'elles ont l'intention d'accomplir. en particulier dans ce cas, il arfaut une explication, car c'est la clé pour créer la bibliothèque statique.
Joost
1
Le arprogramme crée, modifie et extrait des archives, qui sont des fichiers uniques contenant une collection d'autres fichiers dans une structure qui permet de récupérer les fichiers individuels d'origine. arcrée un index des symboles définis dans les modules d'objets déplaçables dans l'archive lorsque vous spécifiez le modificateur s. (voir man ar)
Alex44
2
Veuillez ajouter les lignes suivantes à votre en-tête pour prendre en charge le c++compilateur: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M
12

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

Ignacio Vazquez-Abrams
la source