Come compilare una libreria statica in Linux?


138

Ho una domanda: come compilare una libreria statica in Linux gcc, cioè devo compilare il mio codice sorgente in un file chiamato out.a. È sufficiente compilare semplicemente con il comando gcc -o out.a out.c? Non ho molta familiarità gcc, spero che qualcuno possa darmi una mano.


controllare questo
Ragioniere م

Risposte:



90

Ecco un esempio completo di 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)

spiegando il makefile:

  • target: prerequisites - il capo della regola
  • $@ - indica l'obiettivo
  • $^ - indica tutti i prerequisiti
  • $< - significa solo il primo prerequisito
  • ar- uno strumento Linux per creare, modificare ed estrarre dagli archivi consultare le pagine man per ulteriori informazioni . Le opzioni in questo caso significano:
    • r - Sostituisci i file esistenti all'interno dell'archivio
    • c - creare un archivio se non già esistente
    • s - crea un indice del file oggetto nell'archivio

Per concludere : la libreria statica sotto Linux non è altro che un archivio di file oggetto.

main.c usando la lib

#include <stdio.h>

#include "lib.h"

int main ( void )
{
    fun1(10);
    fun2(10);
    return 0;
}

lib.h l'intestazione principale di libs

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c prima fonte lib

#include "lib1.h"

#include <stdio.h>

void fun1 ( int x )
{
    printf("%i\n",x);
}

lib1.h l'intestazione corrispondente

#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 seconda fonte lib

#include "lib2.h"

#include <stdio.h>

void fun2 ( int x )
{
    printf("%i\n",2*x);
}

lib2.h l'intestazione corrispondente

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun2 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB2_H_INCLUDED */

avrebbe aiutato a sottolineare cosa fanno i comandi e cosa intendono ottenere. soprattutto in questo caso la arspiegazione dei bisogni, in quanto è la chiave per creare la libreria statica.
Joost

1
Il arprogramma crea, modifica ed estrae dagli archivi, che sono singoli file che contengono una raccolta di altri file in una struttura che consente di recuperare i singoli file originali. arcrea un indice per i simboli definiti nei moduli oggetto trasferibili nell'archivio quando si specificano i modificatori. (vedi man ar)
Alex44

2
per favore aggiungi le seguenti righe alla tua intestazione per supportare il c++compilatore: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.