के साथ नहीं हो रहा है, कुछ समय पहले, मैंने सोचा था कि एक .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 के निर्माता और नाशक कहा जाता है नहीं कर रहे हैं ... क्यों?
- उन्हें स्वचालित रूप से कैसे कॉल किया जाए?
धन्यवाद।
धन्यवाद। ऐसा लगता है कि एक .a में निहित सभी .o फ़ाइलों को जोड़ने के लिए लिंकर विकल्प -ब्लूएल, - पूर्ण-संग्रह (या -Wl,-Mac_X पर -all_load) का उपयोग करके मजबूर किया जा सकता है ... – moala
मैकोज़क्स के लिए -force_load भी देखें – moala
क्या कोई समस्या होगी, यदि 'someo 'से' 1.o' और '2.o' दोनों में एक ही नाम के साथ दो वैश्विक चर हैं? क्या उन्हें एक निष्पादन योग्य में जोड़ा जा सकता है (मामलों पर विचार करें: वैश्विक को संदर्भित किया जाता है/निष्पादन योग्य से संदर्भित नहीं किया जाता है)? –