2013-02-13 6 views
6

एकमात्र लाभ जो मैं सोच सकता हूं संकलन गति है। दोनों मामलों में अंतिम परिणाम (बाइनरी आकार और गति) एक जैसा होना चाहिए (जब तक स्थिर पुस्तकालय को बिना अनुकूलन के संकलित किया गया हो)।प्रीकंपील्ड स्टैटिक लाइब्रेरी का उपयोग सीधे इसके स्रोत कोड सहित करने के क्या फायदे हैं?

इसके अलावा कुछ संदर्भों की सराहना की जाएगी।

अद्यतन: यह प्रश्न तब सामने आया जब हमें हमारी परियोजना में छोटी तृतीय पक्ष ओपन सोर्स लाइब्रेरी शामिल करना पड़ा। एक डेवलपर ने एक बयान दिया कि प्रीकंपील्ड स्टैटिक लाइब्रेरी (केवल स्रोत फाइलों की प्रतिलिपि बनाने के बजाय) ऐप के प्रदर्शन में वृद्धि होगी। मुझे कोई कारण नहीं दिखता कि यह मामला क्यों होना चाहिए।

तो सवाल यह है कि: प्रीकंपिल्ड लाइब्रेरी को शामिल करने से वास्तव में अंतिम ऐप के प्रदर्शन में सुधार होगा?

उत्तर

3

आप किसी तृतीय पक्ष पुस्तकालय के बारे में बात कर रहे हैं, उनके लिए कुछ फायदे हैं: स्रोत कोड जारी करने के लिए कोई ज़रूरत नहीं, (संभावित) अंत डेवलपर्स के लिए सरल स्थापना ... हालांकि कभी-कभी यह पता चला है की अधिक होने के लिए एक परेशानी, विशेष रूप से यदि यह सही नहीं किया गया है (प्रतीकों को ठीक किए बिना अन्य खुली स्रोत परियोजनाओं में लिंक करना, गलत आर्किटेक्चर समर्थित)।

यदि आपका मतलब सिर्फ अपना कोड है - ऐसा लगता है कि आप केवल अपने लिए सिरदर्द बना रहे हैं। अगर फ़ाइलें बदल नहीं रही हैं, तो वे पहले से ही (.o) डिस्क पर संकलित होने जा रहे हैं, और संकलक को तब तक पुनर्निर्माण करने की आवश्यकता नहीं होगी जब तक आप सभी को क्लीन/पुनर्निर्माण नहीं करते। तो आप शायद संकलन की गति हासिल नहीं करेंगे।

किसी भी तरह से - हाँ, आउटपुट एक जैसा होना चाहिए। एक स्थैतिक रूप से जुड़ी लाइब्रेरी सिर्फ वही संग्रह है जो आप सीधे लिंक कर रहे थे।

संपादित करें:

ओ बनाम ए की विशेष रूप से संबोधित करते हुए गति - ए बस विकास के दौरान पैकेजिंग में आसानी के लिए ओ फ़ाइलों का एक संग्रह है। एक बार जुड़े हुए, परिणाम समान है। मैंने अभी सत्यापित करने के लिए एक त्वरित सैनिटी परीक्षण किया है:

$ cat a.c 
#include <stdio.h> 

extern char *something(); 

int main() 
{ 
    printf("%s", something()); 
    return 0; 
} 
$ cat b.c 
char *something() 
{ 
    return "something fancy here\n";  
} 

$ gcc -c -o a.o a.c 
$ gcc -c -o b.o b.c 
$ gcc -o foo1 a.o b.o 
$ ar -r b.a b.o 
ar: creating archive b.a 
$ gcc -o foo2 a.o b.a 
$ cmp foo1 foo2 

और वहां आपके पास यह है, .o vs .a को जोड़कर समान बाइनरी।

थोड़ा सा प्रदर्शन हिट है यदि आप स्थिर पुस्तकालयों के बजाय गतिशील पुस्तकालयों का उपयोग करते हैं (मुझे विश्वास है कि केवल प्रतीकों को देखा जाता है)। शायद यह वही है जो अन्य डेवलपर का जिक्र कर रहा था, कि स्थिर पुस्तकालय गतिशील पुस्तकालयों की तुलना में थोड़ा तेज़ होंगे।

+0

मैं अपने उत्तर देने के लिए इस उत्तर के बहुत से सहमत हूं। लेकिन सिर्फ यह जोड़ना चाहता था कि यह वास्तव में इस बात पर निर्भर करता है कि आप कौन हैं और परियोजना क्या है। अपनी सामग्री, जहां आप स्रोत के मालिक हैं और साझा करने के बारे में चिंता करने की ज़रूरत नहीं है, तो स्थैतिक libs बिना किसी भुगतान के व्यर्थ और केवल अतिरिक्त काम हैं। यदि आप अन्य लोगों को रिहा करने की योजना बना रहे हैं, तो वे आपके स्रोत कोड की सुरक्षा के लिए बहुत अच्छे हैं। Precompiled और उपयोग करने के लिए तैयार है। –

+0

मैंने इसके संदर्भ को बेहतर दिखाने के लिए प्रश्न अपडेट किया है। जहां तक ​​मैं एक स्थिर पुस्तकालय को समझता हूं, एक कंपाइलर का कच्चा उत्पादन कम या कम होता है, इसलिए चरण को जोड़ने पर इसे कोई फर्क नहीं पड़ता है कि यह स्थिर पुस्तकालय या कंपाइलर द्वारा उत्पादित फाइलों के खिलाफ जुड़ा हुआ है या नहीं। – DexM

+0

आपके अपडेट किए गए प्रश्न को संबोधित करने के लिए उत्तर अपडेट किया गया। – escrafford

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