Bagaimana cara mengkompilasi perpustakaan statis di Linux?


141

Saya punya pertanyaan: Bagaimana mengkompilasi perpustakaan statis di Linux dengan gcc, yaitu saya perlu mengkompilasi kode sumber saya ke dalam sebuah file bernama out.a. Apakah cukup hanya dengan mengkompilasi dengan perintah gcc -o out.a out.c? Saya tidak begitu paham gcc, semoga ada yang bisa membantu saya.


periksa ini
Akuntan م

Jawaban:



93

Berikut contoh makefile lengkap:

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)

menjelaskan makefile:

  • target: prerequisites - kepala aturan
  • $@ - Berarti targetnya
  • $^ - Berarti semua prasyarat
  • $< - Berarti hanya prasyarat pertama
  • ar- Alat Linux untuk membuat, memodifikasi, dan mengekstrak dari arsip lihat halaman manual untuk informasi lebih lanjut . Opsi dalam hal ini berarti:
    • r - ganti file yang ada di dalam arsip
    • c - buat arsip jika belum ada
    • s - membuat indeks file objek ke dalam arsip

Kesimpulannya : Pustaka statis di Linux tidak lebih dari arsip file objek.

main.c menggunakan lib

#include <stdio.h>

#include "lib.h"

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

lib.h header utama libs

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c sumber lib pertama

#include "lib1.h"

#include <stdio.h>

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

lib1.h header yang sesuai

#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 sumber lib kedua

#include "lib2.h"

#include <stdio.h>

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

lib2.h header yang sesuai

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED

#ifdef __cplusplus
   extern “C” {
#endif

void fun2 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB2_H_INCLUDED */

itu akan membantu untuk menunjukkan apa yang perintah itu lakukan, dan apa yang ingin mereka capai. terutama dalam hal ini arperlu penjelasan, karena ini adalah kunci untuk membuat perpustakaan statis.
Joost

1
The arProgram menciptakan, memodifikasi, dan ekstrak dari arsip, yang merupakan file tunggal memegang koleksi file lain dalam suatu struktur yang memungkinkan untuk mengambil file individual asli. armembuat indeks ke simbol yang ditentukan dalam modul objek yang dapat direlokasi di arsip saat Anda menentukan pengubah s. (lihat man ar)
Alex44

2
silakan tambahkan baris berikut ke header Anda untuk mendukung c++kompiler: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.