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.

Summer_More_More_Tea
sumber
periksa ini
Akuntan م

Jawaban:

212

Lihat Membuat pustaka bersama dan statis dengan gnu compiler [gcc]

gcc -c -o out.o out.c

-c berarti membuat file objek perantara, bukan file yang dapat dieksekusi.

ar rcs libout.a out.o

Ini menciptakan perpustakaan statis. rartinya menyisipkan dengan pengganti, cartinya membuat arsip baru, dan ssarana menulis indeks. Seperti biasa, lihat halaman manual untuk info lebih lanjut.

Matthew Flaschen
sumber
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 */
Alex44
sumber
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
12

Buat file objek dengan gcc, lalu gunakan aruntuk menggabungkannya ke dalam pustaka statis.

Ignacio Vazquez-Abrams
sumber