Jak skompilować bibliotekę statyczną w systemie Linux?

138

Mam pytanie: Jak skompilować bibliotekę statyczną w Linuksie gcc, tzn. Muszę skompilować swój kod źródłowy do pliku o nazwie out.a. Czy wystarczy po prostu skompilować się z poleceniem gcc -o out.a out.c? Nie jestem do końca zaznajomiony z tym gcc, mam nadzieję, że ktoś może mi pomóc.

Summer_More_More_Tea
źródło
sprawdź to
Księgowy م

Odpowiedzi:

89

Oto przykład pełnego pliku 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)

wyjaśnienie pliku makefile:

  • target: prerequisites - głowa reguły
  • $@ - oznacza cel
  • $^ - oznacza wszystkie warunki wstępne
  • $< - oznacza tylko pierwszy warunek wstępny
  • ar- narzędzie Linux do tworzenia, modyfikowania i wyodrębniania z archiwów. Więcej informacji na stronach podręcznika man . Opcje w tym przypadku oznaczają:
    • r - zastąp pliki istniejące w archiwum
    • c - utwórz archiwum, jeśli jeszcze nie istnieje
    • s - utworzyć indeks plików obiektowych w archiwum

Podsumowując : biblioteka statyczna w Linuksie to nic innego jak archiwum plików obiektowych.

main.c przy użyciu biblioteki lib

#include <stdio.h>

#include "lib.h"

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

lib.h główny nagłówek libs

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c pierwsze źródło lib

#include "lib1.h"

#include <stdio.h>

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

lib1.h odpowiedni nagłówek

#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 drugie źródło lib

#include "lib2.h"

#include <stdio.h>

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

lib2.h odpowiedni nagłówek

#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
źródło
pomogłoby to wskazać, co robią polecenia i co zamierzają osiągnąć. szczególnie w tym przypadku arpotrzeba wyjaśnienia, gdyż jest to klucz do stworzenia biblioteki statycznej.
Joost
1
arProgram tworzy, modyfikuje i wyciągi z archiwów, które są pojedyncze pliki posiadający zbiór innych plików w strukturze, która umożliwia pobieranie plików oryginalnych. artworzy indeks do symboli zdefiniowanych w relokowalnych modułach obiektów w archiwum, gdy określisz modyfikator s. (zobacz man ar)
Alex44
2
proszę dodać następujące linie do nagłówka, aby obsługiwać c++kompilator: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M
12

Wygeneruj pliki obiektów za pomocą gcc, a następnie użyj, araby spakować je w bibliotekę statyczną.

Ignacio Vazquez-Abrams
źródło