2012-10-12 19 views
8

के साथ निर्मित एक स्थिर लाइब्रेरी से लिंक करना सुरक्षित है, मैं अपनी सी ++ परियोजनाओं का परीक्षण करने के लिए GoogleTest का उपयोग करता हूं, और उस प्रीकंपिल्ड लाइब्रेरी को अब उबंटू पैकेज में वितरित नहीं किया गया था, मुझे परियोजना वेबसाइट पर निम्न मिला:क्या विभिन्न कंपाइलर झंडे

आप अलग संकलक झंडे का उपयोग करके Google टेस्ट और अपने परीक्षण कोड संकलन है, वे (गूगल टेस्ट में #if के उपयोग के कारण जैसे) एक ही वर्ग/समारोह/चर के विभिन्न परिभाषाओं देख सकते हैं। इसलिए, आपकी सैनिटी के लिए, हम पूर्व-संकलित Google टेस्ट लाइब्रेरी इंस्टॉल करने से बचने की सलाह देते हैं। इसके बजाए, प्रत्येक प्रोजेक्ट को Google टेस्ट स्वयं संकलित करना चाहिए ताकि यह सुनिश्चित हो सके कि फ़्लैग का उपयोग Google टेस्ट और परीक्षण दोनों के लिए किया जाता है।

क्या मैं इस से ले कि यह एक बुरा विचार है परियोजना परीक्षण किया जा रहा से अलग GoogleTest संकलित करने के लिए है। जो मुझे समझ में नहीं आता है यह है कि यह सिर्फ एक GoogleTest बात है, या यदि यह पुस्तकालयों को जोड़ने के लिए एक सामान्य बात है।

प्रश्न

वहाँ किसी भी स्थिति है जिसमें यह तीसरे पक्ष के पुस्तकालयों, संकलक झंडे या अन्यथा precompiled से जोड़ने के लिए, और यदि नहीं असुरक्षित है है, क्या GoogleTest में ऐसी क्या खास है?

+0

आपका उद्धरण महत्वपूर्ण हिस्सा गायब प्रतीत होता है: 'यदि आप विभिन्न संकलक झंडे का उपयोग करके Google टेस्ट और अपने परीक्षण कोड को संकलित करते हैं, तो वे एक ही कक्षा/फ़ंक्शन/चर के विभिन्न परिभाषाएं देख सकते हैं (उदाहरण के लिए #if के उपयोग के कारण Google टेस्ट में)।' –

+0

मैंने आपके द्वारा बताए गए बिट के साथ उद्धरण अपडेट किया है। –

उत्तर

6

कुछ कंपाइलर झंडे हैं, विशेष रूप से वे जो संरेखण के साथ काम करते हैं, जो किसी समस्या का कारण बन सकता है।

से GCC i386 and x86-64 flags

-malign-डबल
-mno पंक्ति-डबल

नियंत्रित करें कि जीसीसी एक दो शब्द सीमा पर, डबल लंबे डबल, और लंबे चर संरेखित करता है या एक शब्द सीमा। दो-शब्द सीमा पर डबल चर को संरेखित करने से कोड उत्पन्न होता है जो अधिक स्मृति की कीमत पर पेंटियम पर कुछ हद तक तेजी से चलता है।

x86-64 पर, -मलिन-डबल डिफ़ॉल्ट रूप से सक्षम है।

चेतावनी: यदि आप -मलिन-डबल स्विच का उपयोग करते हैं, तो उपरोक्त प्रकार वाले संरचनाओं को 386 और के लिए प्रकाशित अनुप्रयोग बाइनरी इंटरफ़ेस विनिर्देशों के मुकाबले अलग-अलग गठबंधन किया गया है, उस स्विच के बिना संकलित कोड में संरचनाओं के साथ बाइनरी संगत नहीं हैं।

उदाहरण के लिए, 32-बिट सिस्टम पर उस ध्वज का उपयोग करके युगल और लंबे समय तक 64-बिट गठबंधन किया जाएगा। यदि आप ध्वज के बिना लाइब्रेरी संकलित करते हैं, तो ध्वज का उपयोग करते समय लाइब्रेरी का उपयोग करने का प्रयास करें, उपरोक्त प्रकार वाले संरचनाओं में अलग-अलग संरेखण हो सकते हैं, और इंटरऑपरेट नहीं हो सकते हैं।

अन्य (बहुत सरल) मामले भी # परिभाषाओं का एक ही सेट सुनिश्चित कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि समान कार्य/संरचना/कक्षा परिभाषाओं का उपयोग किया जाता है (और ऐसे अन्य ओडीआर उल्लंघनों)। उदाहरण के लिए, जीसीसी में '--std = C++ 11' का उपयोग, जो मानक लाइब्रेरी कक्षाओं के सी ++ 11 संस्करणों को सक्षम बनाता है, जो कुछ मामलों में पिछले संस्करणों से अलग हैं।

+1

'/ will/may/g' - किस्मत के आधार पर, लाइब्रेरी वास्तव में ठीक काम कर सकती है। –

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