के साथ संकलित किया गया है तो मैंने एक ऐसी प्रणाली बनाई है जो वैश्विक उदाहरण के निर्माता के आधार पर स्वचालित रूप से फ़ंक्शन ऑब्जेक्ट्स (फ़ैक्टर) को मानचित्र में पंजीकृत करता है।सी ++ ग्लोबल वैरिएबल प्रारंभिक पुस्तकालयों के माध्यम से लिंक नहीं किया गया है, लेकिन जब स्रोत
प्रत्येक सीपीपी फ़ाइल में जो मिक्सर को परिभाषित करता है, रजिस्ट्रार क्लास इंस्टेंस का ग्लोबल इंस्टेंस है जो मल्टीक्टर को सिंगलटन std::map<int, std::function<...> >
ऑब्जेक्ट में पंजीकृत करने के लिए है।
template
<
typename map_type,
typename handler_type
>
struct registrar
{
registrar
(
map_type& map_object,
boost::uint16_t cmd_code,
const handler_type& handler
)
{
map_object.insert(std::pair<boost::uint16_t, handler_type>(cmd_code, handler));
}
};
प्रत्येक .cpp फ़ाइल में
:
यह रजिस्ट्रार वर्ग की परिभाषा है। वैश्विक उदाहरण इस तरह परिभाषित किया गया है: अगर मैं एक साथ main.cpp के साथ सभी सीपीपी संकलन
namespace one_way
{
static registrar <in_out_map_type, handler>
post_receiver(in_out_map_type::instance(), command, handlers());
}
सभी ठीक काम करता है। लेकिन अगर मैं एक सीपीपी फ़ाइल को स्थिर पुस्तकालय में संकलित करता हूं और इसे main.cpp
से लिंक करता हूं, तो पंजीकरण काम नहीं करता है।
मैंने विंडोज & और उबंटू 11.10 दोनों पर वीसी 10 और जीसीसी 4.61 के साथ परीक्षण किया। दोनों असफल हो जाते हैं।
मुझे a thread with the same problem मिला लेकिन ओपी ने यह नहीं कहा कि उसने इसे हल किया है या नहीं।
क्या मुझे कुछ याद आ रही है?
संपादित
टिप्पणियों सहित सभी प्रतिक्रियाओं के लिए धन्यवाद।
प्रत्येक प्रतिक्रिया ने वास्तव में मुझे और अधिक सोचने और इस विधि में गहरी जांच करने में मदद की। सभी अध्ययन और परीक्षणों के बाद, मैं अंत में ऊपर द्विआधारी सीमाओं भर में आत्म पंजीकरण के लिए वैश्विक/स्थिर चर पर निर्भर का विचार है, दिया नहीं पोर्टेबल गारंटी करने के लिए यह काम करेंगे तरीका नहीं है।
मेरा अंतिम तरीका पंजीकरण को एक बाइनरी में रखना है।
आप यह नहीं दिखाते कि आप पंजीकृत कार्यों के लिए रजिस्ट्रार को कैसे कॉल कर रहे हैं। साथ ही, 'ग्लोबल इंस्टेंस' ('हैंडलर()' के बजाय 'हैंडलर()' में एक टाइपो है? जब तक कि मुझे कुछ याद नहीं आ रहा है, जो एक फ़ंक्शन को परिभाषित करता है, न कि वैश्विक चर। तो, ऐसा लगता है, मुझे लगता है कि तस्वीर से कई कनेक्टिंग डॉट्स गायब हैं ... –
फ़ंक्शन पंजीकृत करने के लिए स्थिर प्रारंभिकरण पर निर्भर होने से शायद लंबे समय तक थोड़ा सा त्रुटि हो सकती है। क्या आपने अभी स्पष्ट पंजीकरण किया है? –
जीसीसी के लिए, एक नज़र डालें, -ब्लूएल, - संपूर्ण संग्रह मदद करता है। –