Wie kompiliere ich eine statische Bibliothek unter Linux?

138

Ich habe eine Frage: Wie kompiliere ich eine statische Bibliothek unter Linux mit gcc, dh ich muss meinen Quellcode in eine Datei mit dem Namen out.a kompilieren. Reicht es aus, einfach mit dem Befehl zu kompilieren gcc -o out.a out.c? Ich bin nicht ganz vertraut mitgcc , hoffe, jemand kann mir helfen.

Summer_More_More_Tea
quelle
Überprüfen Sie dies
Buchhalter م

Antworten:

89

Hier ein vollständiges Makefile-Beispiel:

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)

Erklären des Makefiles:

  • target: prerequisites - der Regelkopf
  • $@ - bedeutet das Ziel
  • $^ - bedeutet alle Voraussetzungen
  • $< - bedeutet nur die erste Voraussetzung
  • ar- Ein Linux-Tool zum Erstellen, Ändern und Extrahieren aus Archiven. Weitere Informationen finden Sie in den Manpages . Die Optionen in diesem Fall bedeuten:
    • r - Ersetzen Sie die im Archiv vorhandenen Dateien
    • c - ein Archiv erstellen, falls noch nicht vorhanden
    • s - Erstellen Sie einen Objektdatei-Index im Archiv

Fazit : Die statische Bibliothek unter Linux ist nichts anderes als ein Archiv von Objektdateien.

main.c mit der lib

#include <stdio.h>

#include "lib.h"

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

lib.h der libs- Hauptheader

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c erste lib-Quelle

#include "lib1.h"

#include <stdio.h>

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

lib1.h der entsprechende Header

#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 zweite lib-Quelle

#include "lib2.h"

#include <stdio.h>

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

lib2.h der entsprechende Header

#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
quelle
Es hätte geholfen, darauf hinzuweisen, was die Befehle tun und was sie erreichen wollen. Insbesondere in diesem Fall armuss dies erklärt werden, da dies der Schlüssel zum Erstellen der statischen Bibliothek ist.
Joost
1
Das arProgramm erstellt, ändert und extrahiert aus Archiven, bei denen es sich um einzelne Dateien handelt, die eine Sammlung anderer Dateien in einer Struktur enthalten, die das Abrufen der einzelnen Originaldateien ermöglicht. arErstellt einen Index für die Symbole, die in verschiebbaren Objektmodulen im Archiv definiert sind, wenn Sie die Modifikatoren angeben. (siehe man ar)
Alex44
2
Bitte fügen Sie Ihrem Header folgende Zeilen hinzu, um den c++Compiler zu unterstützen : #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M
12

Generieren Sie die Objektdateien mit gcc und arbündeln Sie sie dann in einer statischen Bibliothek.

Ignacio Vazquez-Abrams
quelle