लिनक्स में स्थिर पुस्तकालय कैसे संकलित करें?


138

मेरे पास एक प्रश्न है: लिनक्स में एक स्थिर पुस्तकालय को कैसे संकलित किया जाए gcc, अर्थात मुझे अपने स्रोत कोड को एक फ़ाइल में संकलित करना होगा जिसका नाम है I. क्या केवल आदेश के साथ संकलन करना पर्याप्त है gcc -o out.a out.c? मैं काफी परिचित नहीं हूँ gcc, आशा है कि कोई भी मुझे हाथ दे सकता है।


जवाबों:


206

ग्नू कंपाइलर [gcc] के साथ एक साझा और स्टैटिक लाइब्रेरी बनाना देखें

gcc -c -o out.o out.c

-c एक निष्पादन योग्य के बजाय एक मध्यस्थ वस्तु फ़ाइल बनाने का मतलब है।

ar rcs libout.a out.o

यह स्टेटिक लाइब्रेरी बनाता है। rप्रतिस्थापन के साथ डालने का मतलब है, cएक नया संग्रह बनाने का मतलब है, और sएक इंडेक्स लिखने का मतलब है। हमेशा की तरह, अधिक जानकारी के लिए मैन पेज देखें ।


89

यहाँ एक पूर्ण मेकअप उदाहरण:

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)

मेकफाइल को समझाते हुए:

  • target: prerequisites - नियम प्रमुख
  • $@ - लक्ष्य का मतलब है
  • $^ - का अर्थ है सभी आवश्यक शर्तें
  • $< - मतलब सिर्फ पहली शर्त
  • ar- अभिलेखागार से एक लिनक्स उपकरण बनाने, संशोधित करने और निकालने के लिए, अधिक जानकारी के लिए मैन पेज देखें । इस मामले में विकल्प का मतलब है:
    • r - संग्रह के अंदर मौजूद फ़ाइलों को बदलें
    • c - अगर पहले से मौजूद नहीं है तो एक आर्काइव बनाएं
    • s - संग्रह में एक ऑब्जेक्ट-फ़ाइल इंडेक्स बनाएं

निष्कर्ष निकालने के लिए : लिनक्स के तहत स्थिर पुस्तकालय ऑब्जेक्ट फ़ाइलों के संग्रह से अधिक कुछ नहीं है।

lib का उपयोग कर main.c

#include <stdio.h>

#include "lib.h"

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

lib.h लिबास मुख्य हैडर

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c प्रथम परिवाद स्रोत

#include "lib1.h"

#include <stdio.h>

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

lib1.h संबंधित हेडर है

#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 दूसरा कार्यकारी स्रोत

#include "lib2.h"

#include <stdio.h>

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

lib2.h संबंधित हेडर है

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun2 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB2_H_INCLUDED */

यह इंगित करने में मदद करता था कि कमांड क्या करते हैं, और वे क्या हासिल करना चाहते हैं। विशेष रूप से इस मामले में arस्पष्टीकरण की जरूरत है, क्योंकि यह स्थिर पुस्तकालय बनाने की कुंजी है।
जूस्ट

1
arकार्यक्रम बनाता है, अभिलेखागार से संशोधित, और अर्क है, जो एक संरचना यह संभव मूल व्यक्तिगत फ़ाइलों को पुनः प्राप्त करने के लिए करता है कि में अन्य फ़ाइलों का एक संग्रह के आयोजन के लिए एक एकल फ़ाइलें हैं। arजब आप संशोधक को निर्दिष्ट करते हैं तो संग्रह में स्थानांतरित वस्तु ऑब्जेक्ट मॉड्यूल में परिभाषित प्रतीकों के लिए एक सूचकांक बनाता है। (देखें man ar)
१०:१० पर एलेक्स ४४

2
कृपया c++कंपाइलर का समर्थन करने के लिए अपने हेडर में निम्नलिखित लाइनें जोड़ें : #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.