2009-07-10 13 views
10

यह मेरे लिए पहले हुआ है पर, लेकिन मैं याद नहीं कर सकते मैं इसे कैसे तय की।size_t जी द्वारा ++ पाया नहीं जा सकता है - 4.1 या दूसरों उबंटू 8.1

मैं कुछ कार्यक्रमों के लिए एक नया Ubuntu पर यहाँ संकलन नहीं कर सकते हैं स्थापित ... कुछ मेरी हेडर के साथ धराशायी हो गया है।

मैं कोशिश की है जी ++ - 4.1 और 4.3 कोई लाभ नहीं हुआ।

g++ -g -frepo -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include -c qlisttest.cpp 
/usr/include/libio.h:332: error: ‘size_t’ does not name a type 
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope 
/usr/include/libio.h:364: error: ‘size_t’ has not been declared 
/usr/include/libio.h:373: error: ‘size_t’ has not been declared 
/usr/include/libio.h:493: error: ‘size_t’ does not name a type 
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared 
... 

फ़ाइल ...

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
... 



@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t 
typedef __kernel_size_t size_t; 
typedef __kernel_ssize_t ssize_t; 

types.h रास्ते में निश्चित रूप से है, और उठाया हो रही है। मैं फ़ाइल नाम बदलकर सत्यापित और एक त्रुटि अपने लापता ...

किसी को भी किसी भी विचार है मिलता है ...? मैं वास्तव में मदद की सराहना करते हैं ...

उत्तर

8

प्रारंभ शामिल/लिनक्स और -आई/usr/शामिल हैं। पथों को मैन्युअल रूप से शामिल करने के लिए सिस्टम निर्देशिका जोड़ना या तो कोई प्रभाव नहीं पड़ता है, या चीजों को तोड़ता है। इसके अलावा, अतिरिक्त सुरक्षा के लिए हटाएं- frepo।

4

यह कहना क्या मुद्दा अपनी पूरी स्रोत देखे बिना है मुश्किल है। इस तरह के मुद्दों को डीबग करने का सबसे अच्छा तरीका प्री-प्रोसेसर आउटपुट बनाने के लिए जी ++ के "-ई" पैरामीटर का उपयोग करना है, और उसके बाद यह पता लगाने के लिए कि इसमें क्या हो रहा है, यह देखने के लिए है। यहां बताया गया है कि g ++ जानकारी पृष्ठ "-E" के बारे में क्या कहता है:

-E प्रीप्रोकैसिंग चरण के बाद रोकें; संकलक को उचित मत चलाओ। आउटपुट प्रीप्रोसेस्ड सोर्स कोड के रूप में है, जो मानक आउटपुट पर भेजा गया है।

इसके अलावा, फ़ाइल के शीर्ष पर केवल sys/type.h क्यों शामिल नहीं है?

परिशिष्ट:

#include <time.h> 

और फिर मैं सामना किया है::

अपने सिस्टम पर, मैं तो केवल foo.cc कहा जाता है एक छोटी फ़ाइल बना ली है

जी ++ -E /tmp/foo.cc> /tmp/foo.pp

इस आउटपुट को अधिक विस्तार से देखते हुए v ery महत्वपूर्ण है। उदाहरण के लिए, मैंने सीखा है कि /usr/include/bits/types.h में __time_t के लिए टाइप टाइप है, और वह /usr/include/types.h तब उस टाइपपीफ का उपयोग "typedef __time_t time_t" कहने के लिए करता है। लेकिन, उस definiton के आसपास दिलचस्प अन्य मैक्रोज़ हैं। /usr/include/time.h में मैक्रो "__BEGIN_NAMESPACE_STD" जैसी चीज़ों पर विशेष ध्यान दें, जो कि मेरे सिस्टम पर एक खाली परिभाषा प्रतीत होता है। लेकिन, मैं कल्पना कर सकता हूं कि कुछ अन्य सिस्टमों के पास इस मैक्रो के लिए एक अलग मूल्य हो सकता है, जो किसी अन्य नेमस्पेस में time_t की परिभाषा को मजबूर करता है।

सीपीपी जानकारी पृष्ठ, खंड "9 प्रीप्रोसेसर आउटपुट" पढ़ें जो फ़ाइल की रेखाओं के प्रारूप को परिभाषित करता है। विशेष रूप से ध्यान दें पर अनुभाग है:

स्रोत फ़ाइल नाम और लाइन नंबर जानकारी प्रपत्र की तर्ज

# lineNum FILENAME FLAGS

और फिर से अवगत करा दिया गया है "FLAGS वर्णन करने के लिए पर चला जाता है "जो डिबगिंग के इस स्तर के लिए रुचि रखते हैं।

+0

धन्यवाद ... मैंने कोई फायदा नहीं होने के लिए sys/type.h और type.h जोड़ने का प्रयास किया है। लेकिन -ई निश्चित रूप से उपयोगी है - आकार_टी के लिए उस पर एक grep और मुझे इसके लिए एक टाइपिफ़ नहीं मिल रहा है .... hmm – EdH

+0

कोशिश करने की एक और चीज "gcc -E /tmp/foo.c के आउटपुट की तुलना करना होगा। "और" g ++ -E /tmp/foo.cc "पूर्व में सी कंपाइलर और बाद वाला सी ++ कंपाइलर आक्रमण करता है। (foo.c और foo.cc के पास कुछ भी नहीं होना चाहिए "# शामिल करें " – slacy

4

आम तौर पर, आपको सी ++ के लिए सी। एच फाइलों का उपयोग नहीं करना चाहिए। जबकि आपको इससे दूर जाने का एक आसान तरीका मिल सकता है, और जबकि जी ++ के पिछले संस्करणों में और अन्य कंप्यूटर्स में इसकी बहुत कुछ अनुमति दी गई थी, सी ++ मानक आकार_टी को cstddef में परिभाषित करता है (अनुभाग 18.2/तालिका 17 देखें)। जी ++ केवल अधिक सख्त हो रहा है।

निकालें सभी रास्ते आप अपने आदेश में शामिल किया है भी शामिल है (वे अनावश्यक हैं), और अगर शामिल नहीं अपने स्रोत कोड के शीर्ष करने के लिए जोड़: निकाल कर मैं/usr/

#include <cstddef> 
using namespace std; 
+0

यह सच नहीं है। सी ++ अनुवाद इकाइयों में सी शीर्षकों की अनुमति है, और C++ समकक्षों जैसे cstddef का उपयोग करने से परेशान करने की कोई आवश्यकता नहीं है। –

+0

कृपया उद्धरण दें संदर्भ में क्यों लगता है कि सी ++ समकक्ष अनावश्यक हैं। क्या ये सभी सी ++ कंपाइलर डेवलपर्स वास्तव में अपना समय बर्बाद कर रहे हैं? –

+0

cstddef बस stddef.h की तरह है सिवाय इसके कि cstddef नामस्थान std में है। C++ समकक्ष नामस्थान प्रदूषण से बचने के लिए अधिक सुविधाजनक हैं, यह सब कुछ है। –

3

क्या आपने बिल्ड-आवश्यक पैकेज स्थापित किया है?

sudo apt-get install build-essential 
+0

हाँ मेरे पास था। लेकिन आपको निश्चित रूप से निश्चित रूप से इसकी आवश्यकता है। धन्यवाद। – EdH

1

यह stddef.h या cstddef में होना चाहिए। type.h एक मानक पुस्तकालय नहीं है, और मेरा मानना ​​है कि यह ओएस की जरूरतों को संदर्भित करता है।

3

इस पर अनुसरण करने के लिए भूल गए। यह पता चला है कि इस विशेष distro पर /usr/include/usr/include/linux के साथ शामिल नहीं किया जा सकता है। size_t दूसरे द्वारा बाहर निकाला जा रहा प्रतीत होता है।

मेरा शामिल है केवल /usr/include और यह बहुत अच्छा काम करता है।

-I/usr/include -I/usr/include/ace -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0... 

सभी शामिल करने और उनके साथ खेलने के लिए इसे ठीक करना।

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