2013-06-13 2 views
20

मैंने सी ++ में क्रॉस प्लेटफार्म सॉफ्टवेयर विकसित किया। जैसा कि मुझे पता है, लिनक्स। इसलिए सभी प्रतीकों को डिफ़ॉल्ट रूप से निर्यात किया गया है, अच्छी तरह से "gcc -fvisibility=hidden" के माध्यम से मैं सभी निर्यात किए गए प्रतीकों को छुपा के रूप में सेट कर सकता हूं, फिर उस वर्ग और फ़ंक्शन के लिए __attribute__(visibility("default")) सेट करें, जिसे मैं निर्यात करना चाहता हूं, इसलिए मैं जो निर्यात करना चाहता हूं उसे नियंत्रित कर सकता हूं।साझा लाइब्रेरी के निर्यात किए गए प्रतीक को नियंत्रित करते समय "gcc -fvisibility = hidden" के बराबर सीएमके क्या है?

मेरा सवाल है, सीएमके का उपयोग करके, मैं "gcc -fvisibility = hidden" नियंत्रण के रूप में काम कैसे कर सकता हूं?

उत्तर

39

:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") 

यकीन है कि यह केवल लिनक्स के तहत किया आप इस कोड का उपयोग कर सकते हैं बनाने के लिए सीधे, आपको वर्तमान सीएमके संस्करण और <LANG>_VISIBILITY_PRESET गुणों का उपयोग करना चाहिए। इस तरह आप अपने सीएमकेलिस्ट में कंपाइलर विनिर्देशों से बच सकते हैं और क्रॉस प्लेटफार्म प्रयोज्यता में सुधार कर सकते हैं (जीसीसी का समर्थन करने जैसी त्रुटियों से बचें और क्लैंग नहीं)।

यानी, आप सी ++ आप set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden) फोन या तो होगा set(CMAKE_CXX_VISIBILITY_PRESET hidden) संपत्ति विश्व स्तर पर स्थापित करने के लिए, या एक विशेष पुस्तकालय या निष्पादन लक्षित करने के लिए सेटिंग को सीमित करने के प्रयोग कर रहे हैं। यदि आप सी का उपयोग कर रहे हैं तो उपरोक्त आदेशों में सी द्वारा सीओक्स को प्रतिस्थापित करें। आप VISIBLITY_INLINES_HIDDEN संपत्ति की भी जांच कर सकते हैं।

GENERATE_EXPORT_HEADER के लिए प्रलेखन दोनों गुणों से संबंधित कुछ और सुझाव और उदाहरण शामिल हैं।

+1

मुझे इसका कोई उचित उदाहरण नहीं मिल रहा है। क्या आप विस्तारित कर सकते हैं? मेरा अनुमान सी ++ SET_TARGET_PROPERTIES (mytarget CXX_VISIBILITY_PRESET छिपा हुआ) के लिए होगा – Abai

+0

@Abai और विवरण जोड़ा गया – Joe

+0

धन्यवाद @ जो, यह बहुत अच्छा काम करता है! – Abai

4

आप उस तरह CMake संकलक करने के लिए एक झंडा जोड़ सकते हैं: संकलक निशानी लगाने के बजाय

IF(UNIX) 
    IF(CMAKE_COMPILER_IS_GNUCC) 
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") 
    ENDIF(CMAKE_COMPILER_IS_GNUCC) 
ENDIF(UNIX) 
+0

वास्तव में, -fvisibility = छिपा भी बजना के साथ इस्तेमाल किया जा सकता है, इसलिए यदि आप इस सुविधा का उपयोग कर सकते हैं आप की तरह कुछ के साथ दोनों compilers उपयोग करने के लिए सक्षम होना चाहते हैं: IF ("$ {CMAKE_CXX_COMPILER_ID}" STREQUAL "जीएनयू" या "$ {CMAKE_CXX_COMPILER_ID}" स्ट्राइकल "क्लैंग") ... ENDIF() – piponazo

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