2010-04-29 18 views
99

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

उत्तर

154

देखें Creating a shared and static library with the gnu compiler [gcc]

gcc -c -o out.o out.c 

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

ar rcs libout.a out.o 

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

9

ऑब्जेक्ट फ़ाइलों को जीसीसी के साथ जेनरेट करें, फिर ar का उपयोग उन्हें स्थिर लाइब्रेरी में बंडल करने के लिए करें।

50

यहाँ एक पूर्ण makefile उदाहरण:

makefile

TARGET = prog 

$(TARGET): main.o lib.a 
    gcc $^ -o [email protected] 

main.o: main.c 
    gcc -c $< -o [email protected] 

lib.a: lib1.o lib2.o 
    ar rcs [email protected] $^ 

lib1.o: lib1.c lib1.h 
    gcc -c -o [email protected] $< 

lib2.o: lib2.c lib2.h 
    gcc -c -o [email protected] $< 

clean: 
    rm -f *.o *.a $(TARGET) 

makefile समझा:

  • target: prerequisites - नियम सिर
  • [email protected] - इसका मतलब है लक्ष्य
  • ,210
  • $^ - सभी आवश्यक शर्तें
  • $< का मतलब है - सिर्फ पहली शर्त
  • ar का मतलब है - एक लिनक्स उपकरण बनाएं, बदलें, और अभिलेखागार see the man pages for further information से निकालने के लिए। इस मामले में विकल्प मतलब है:
    • r - नहीं तो पहले से ही
    • s विद्यमान एक संग्रह बनाने - - संग्रह
  • में एक वस्तु फ़ाइल सूचकांक बनाने संग्रह
  • c अंदर मौजूदा फ़ाइलों को प्रतिस्थापित

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

main.clib

#include <stdio.h> 

#include "lib.h" 

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

का उपयोग कर lib.h libs मुख्य हैडर

#ifndef LIB_H_INCLUDED 
#define LIB_H_INCLUDED 

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

#endif 

lib1।गपहले lib स्रोत

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

#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 */ 
+1

स्पष्टीकरण के लिए धन्यवाद। –

+4

सर्वोत्तम उत्तर उदाहरण वाले हैं, महान काम :) – Youda008

+0

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

संबंधित मुद्दे