2016-10-04 13 views
6

का उपयोग करते समय हम न्यूलिब के तहत सिग्विन पर sigemptyset का उपयोग करते समय संकलक त्रुटियों को पकड़ रहे हैं। त्रुटि सी ++ कंपाइलर के साथ होती है, लेकिन केवल -std=XXX का उपयोग किया जाता है। एक मानक विकल्प के बिना, परीक्षण कार्यक्रम संकलित और निष्पादित के रूप में निष्पादित करता है।त्रुटि "sigemptyset को इस दायरे में घोषित नहीं किया गया था" सी +11 और न्यूलिब

परीक्षण कार्यक्रम नीचे है, और ब्याज के सिग्विन शीर्षलेख निम्नानुसार है। मुझे सिग्विन हेडर में कुछ भी संदिग्ध दिखाई नहीं देता है।

मैंने #define _GNU_SOURCE और #define _XOPEN_SOURCE 700 जैसे चाल की कोशिश की है। मैंने वैश्विक और std नामस्थानों जैसे ट्रिक्स की भी कोशिश की है। संबंधित, What does -D_XOPEN_SOURCE do/mean? और Namespace issues in c++11? देखें।

संकलन विफलता का कारण क्या है और मैं इसे कैसे ठीक कर सकता हूं?


$ cat ~/test.cxx 
#include <signal.h> 

int main(int argc, char* argv[]) 
{ 
    struct sigaction new_handler; 
    return sigemptyset(&new_handler.sa_mask); 
} 

एक -std=XXX के बिना, यह परिणाम:

$ g++ -c test.cxx 
$ 

एक -std=XXX के साथ, यह परिणाम:

$ g++ -std=c++03 -c test.cxx 
test.cxx: In function int main(int, char**): 
test.cxx:6:44: error: sigemptyset was not declared in this scope 
    return sigemptyset(&new_handler.sa_mask); 

और जब ग्लोबल नेम स्पेस में sigemptyset उपयोग करने की कोशिश :

$ g++ -std=c++03 -c test.cxx 
test.cxx: In function ‘int main(int, char**)’: 
test.cxx:6:12: error: ‘::sigemptyset’ has not been declared 
    return ::sigemptyset(&new_handler.sa_mask); 
      ^

Things get worse when using -std=gnu++03 and friends

+0

मेरे * अनुमान *? जब आप जीएनयू एक्सटेंशन के बिना सादे सी ++ मानक का उपयोग करते हैं, तो आपको '' सहित पहले '_XOPEN_SOURCE' को परिभाषित करने की आवश्यकता होती है। –

+0

इसके अलावा, आपको सिग्विन सिग्नल हेडर फ़ाइल के लिए '' में देखना चाहिए। –

+0

धन्यवाद @ जोचिम। जब के लिए grepping 'sigemptyset' दो हिट देखते हैं: (1)'/usr/शामिल/bash/sig.h' और (2) '/ usr/शामिल/sys/signal.h'। – jww

उत्तर

1

मुद्दा Botan 2.1.0 does not compile under Cygwin 2.8.0 with g++ 5.4.0 पर के माध्यम से काम किया गया था कम कर देता है। ब्याज की दो टिप्पणियां यहां दी गई हैं।

पहले, noloader से:

Cygwin Newlib का उपयोग करता है, नहीं जीएनयू के libstdc++। जब -std=c++XX नहीं है, तो वर्तमान जीसीसी डिफ़ॉल्ट रूप से -std=gnu++11 (GCC 6 changes to gnu++14 डिफ़ॉल्ट) पर डिफ़ॉल्ट है। I का मानना ​​है कि जीएनयू स्रोत sigaction जैसे अपेक्षित कार्यों को सुनिश्चित करते हैं, उपलब्ध हैं।

आप -D_XOPEN_SOURCE=600 या -D_XOPEN_SOURCE=700 को आजमाने का विचार कर सकते हैं।

C++ and feature guards Warning Question न्यूलिब मेलिंग सूची पर भी देखें।

दूसरा, SideChannel से:

धन्यवाद @noloader करने के लिए। अब तक -std=c++11Makefile में सेट किया गया था। न्यूलिब मेलिंग सूची पर उपर्युक्त धागे में महत्वपूर्ण जानकारी है। याकोव Selkowitz लिखा है:

जी ++ glibc ठिकानों पर _GNU_SOURCE परिभाषित करता है, जिसका अर्थ है कि -std=c++NN, प्रलेखन, नहीं सख्त आईएसओ सी ++ के विपरीत है:

तो, लागू करने patch #987 और मेरे लिए -std=gnu++11 काम करता है की स्थापना । मैं अन्य -D विकल्पों की कोशिश नहीं की (मुझे लगता है कि अन्य तथ्य मौलिक अधिक है)। संक्षेप में @randombit कृपया लागू पीआर # 987 और Cygwin के तहत जीसीसी के लिए -std=gnu++11 निर्धारित किया है।

2

फ़ंक्शन आईएसओ सी मानक पर एक विस्तार है।
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html

जैसे
__XSI_VISIBLE द्वारा /usr/include/sys/signal.h पर सुरक्षित है> = 4

जानकारी के लिए /usr/include/sys/features.h देखते हैं।

चूक के रूप में सबसे बड़ा परिभाषा सेट का इस्तेमाल किया जाता है, लेकिन -std=XXX परिभाषा गुंजाइश

+0

धन्यवाद Matzeri। यह मुद्दा दिलचस्प है जिस तरह से समस्या सामने आती है। ऐसा लगता है कि सब कुछ असफल होना चाहिए, या सबकुछ सफल होना चाहिए। कम से कम, यह की तरह लगता है '-std = GNU ++ XX' एक डिफ़ॉल्ट कोई' -std' के साथ तैयार की है चाहिए, क्योंकि न तो आईएसओ सी हैं अगर मैं सही ढंग से याद है, कुछ '-std = GNU ++ XX' है जब जीसीसी के सी ++ कंपाइलर का उपयोग करना। मुझे लगता है कि newlib चीजें करता है क्योंकि यह libstdC++ में मौजूद नहीं है। – jww

+0

न्यूलिब हेडर फिर से शफल में हैं। पिछले महीनों में उल्लेखनीय परिवर्तन हुए थे और '/ usr/include/sys/features.h' वर्तमान दिशानिर्देश प्रदान करते हैं। – matzeri

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