Como compilar uma biblioteca estática no Linux?

138

Eu tenho uma pergunta: Como compilar uma biblioteca estática no Linux gcc, ou seja, eu preciso compilar meu código-fonte em um arquivo chamado out.a. É suficiente simplesmente compilar com o comando gcc -o out.a out.c? Não estou familiarizado gcc, espero que alguém possa me dar uma mão.

Summer_More_More_Tea
fonte
verifique isto
Account Manager

Respostas:

89

Aqui está um exemplo completo do 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)

explicando o makefile:

  • target: prerequisites - o chefe da regra
  • $@ - significa o alvo
  • $^ - significa todos os pré-requisitos
  • $< - significa apenas o primeiro pré-requisito
  • ar- uma ferramenta Linux para criar, modificar e extrair de arquivos, consulte as páginas de manual para obter mais informações . As opções neste caso significam:
    • r - substituir arquivos existentes dentro do arquivo
    • c - criar um arquivo se ainda não existir
    • s - criar um índice de arquivo de objeto no arquivo morto

Para concluir : A biblioteca estática no Linux nada mais é do que um arquivo morto de arquivos de objetos.

main.c usando a lib

#include <stdio.h>

#include "lib.h"

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

lib.h o cabeçalho principal da libs

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

primeira fonte lib lib1.c

#include "lib1.h"

#include <stdio.h>

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

lib1.h o cabeçalho correspondente

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

#include "lib2.h"

#include <stdio.h>

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

lib2.h o cabeçalho correspondente

#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
fonte
teria ajudado a indicar o que os comandos fazem e o que eles pretendem alcançar. especialmente neste caso, a arexplicação precisa, pois é a chave para criar a biblioteca estática.
Joost
1
O arprograma cria, modifica e extrai arquivos, que são arquivos únicos que contêm uma coleção de outros arquivos em uma estrutura que possibilita recuperar os arquivos individuais originais. arcria um índice para os símbolos definidos nos módulos de objetos realocáveis ​​no arquivo morto quando você especifica os modificadores. (veja man ar)
Alex44 01/07/19
2
adicione as seguintes linhas ao seu cabeçalho para dar suporte ao c++compilador: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M
12

Gere os arquivos de objeto com o gcc e use-os arpara agrupá-los em uma biblioteca estática.

Ignacio Vazquez-Abrams
fonte