2009-11-26 17 views
22

के साथ नहीं हो रहा है, कुछ समय पहले, मैंने सोचा था कि एक .a स्थैतिक पुस्तकालय सिर्फ ऑब्जेक्ट फाइलों का संग्रह था, बस उन्हें संग्रहित करना और उन्हें अलग-अलग संभालना नहीं था। लेकिन एक .o ऑब्जेक्ट से लिंक करना और इस .o ऑब्जेक्ट युक्त एक .a स्थिर लाइब्रेरी से लिंक करना स्पष्ट रूप से वही नहीं है। और मैं क्यों समझ में नहीं आता ...स्थिर लाइब्रेरी के ग्लोबल्स का स्टेटिक प्रारंभिकरण और विनाश जी ++

के निम्नलिखित स्रोत कोड फ़ाइलों पर विचार करें:

// main.cpp 
#include <iostream> 
int main(int argc, char* argv[]) { 
    std::cout << "main" << std::endl; 
} 

// object.hpp 
#include <iostream> 
struct Object 
{ 
    Object() { std::cout << "Object constructor called" << std::endl; } 
    ~Object() { std::cout << "Object destructor called" << std::endl; } 
}; 

// object.cpp 
#include "object.hpp" 
static Object gObject; 

के संकलन करते हैं और लिंक और इस चलाते हैं कोड:

g++ -Wall object.cpp main.cpp -o main1 
./main1 
> Object constructor called 
> main 
> Object destructor called 

वैश्विक gObject ऑब्जेक्ट का विनाशक कन्स्ट्रक्टर कहलाता है।

अब एक स्थिर पुस्तकालय हमारे कोड से (लिंक) अन्य प्रोग्राम में बनाने और उपयोग यह करते हैं:

g++ -Wall -c object.cpp main.cpp 
ar rcs lib.a object.o 
g++ -Wall -o main2 main.o lib.a 
./main2 
> main 
  • gObject के निर्माता और नाशक कहा जाता है नहीं कर रहे हैं ... क्यों?
  • उन्हें स्वचालित रूप से कैसे कॉल किया जाए?

धन्यवाद।

उत्तर

29

.a स्थैतिक पुस्तकालयों में कई .o होते हैं लेकिन जब तक आप उन्हें मुख्य ऐप से संदर्भित नहीं करते हैं तब तक वे लिंक नहीं होते हैं।
.o फ़ाइलें स्टैंडअलोन लिंक हमेशा।

तो .o लिंकर में फ़ाइलें हमेशा अंदर जाती हैं, संदर्भित होती हैं या नहीं, लेकिन .a फ़ाइलों से केवल .o ऑब्जेक्ट फाइलों को संदर्भित किया जाता है।

एक नोट के रूप में, स्थिर वैश्विक वस्तुओं को तब तक शुरू करने की आवश्यकता नहीं है जब तक आप वास्तव में संकलन इकाई में कुछ भी संदर्भ न दें, अधिकांश कंपाइलर मुख्य से पहले सभी को प्रारंभ करेंगे, लेकिन केवल आवश्यकता यह है कि वे किसी भी कार्य से पहले प्रारंभ हो जाते हैं संकलन इकाई निष्पादित हो जाती है।

+2

धन्यवाद। ऐसा लगता है कि एक .a में निहित सभी .o फ़ाइलों को जोड़ने के लिए लिंकर विकल्प -ब्लूएल, - पूर्ण-संग्रह (या -Wl,-Mac_X पर -all_load) का उपयोग करके मजबूर किया जा सकता है ... – moala

+1

मैकोज़क्स के लिए -force_load भी देखें – moala

+0

क्या कोई समस्या होगी, यदि 'someo 'से' 1.o' और '2.o' दोनों में एक ही नाम के साथ दो वैश्विक चर हैं? क्या उन्हें एक निष्पादन योग्य में जोड़ा जा सकता है (मामलों पर विचार करें: वैश्विक को संदर्भित किया जाता है/निष्पादन योग्य से संदर्भित नहीं किया जाता है)? –

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