Linux'ta statik kitaplık nasıl derlenir?


138

Bir sorum var: Linux ile statik bir kütüphane nasıl gccderlenir, yani kaynak kodumu out.a adlı bir dosyaya derlemem gerekir. Sadece komutla derlemek yeterli gcc -o out.a out.cmi? Pek tanıdık değilim gcc, umarım kimse bana yardım edebilir.


kontrol bu
Muhasebeci م

Yanıtlar:



90

İşte tam bir makefile örneği:

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)

makefile açıklayan:

  • target: prerequisites - kural başlığı
  • $@ - hedef anlamına gelir
  • $^ - tüm önkoşulları ifade eder
  • $< - sadece ilk ön koşul anlamına gelir
  • ar- arşiv oluşturmak, değiştirmek ve arşivden ayıklamak için bir Linux aracı daha fazla bilgi için kılavuz sayfalarına bakınız . Bu durumda seçenekler:
    • r - arşivde bulunan dosyaları değiştirin
    • c - henüz mevcut değilse bir arşiv oluşturun
    • s - arşive bir nesne dosyası dizini oluşturma

Sonuç olarak : Linux altındaki statik kütüphane, nesne dosyalarının arşivinden başka bir şey değildir.

main.c lib kullanarak

#include <stdio.h>

#include "lib.h"

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

lib.h libs ana başlığı

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c ilk lib kaynağı

#include "lib1.h"

#include <stdio.h>

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

lib1.h ilgili başlık

#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 ikinci lib kaynağı

#include "lib2.h"

#include <stdio.h>

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

lib2.h ilgili başlık

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun2 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB2_H_INCLUDED */

komutların ne yaptığını ve neyi başarmayı amaçladıklarını belirtmeye yardımcı olurdu. özellikle bu durumda ar, statik kitaplık oluşturmanın anahtarı olduğu için açıklama ihtiyacı vardır.
Joost

1
arProgram, bu mümkün orijinal tek tek dosyaları almak için kılan bir yapı içinde diğer dosyaların bir koleksiyon tutan tek dosyalardır arşivlerinden değiştirir ve özler oluşturur. ardeğiştiricileri belirlediğinizde arşivdeki yer değiştirebilir nesne modüllerinde tanımlanan sembollere bir dizin oluşturur. (bkz. man ar)
Alex44

2
c++derleyiciyi desteklemek için lütfen başlığınıza aşağıdaki satırları ekleyin : #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

12

Nesne dosyalarını gcc ile oluşturun, ardından arbunları statik bir kitaplıkta paketlemek için kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.