C ++ त्रुटि: 'clock_gettime' और 'clock_settime' के लिए अपरिभाषित संदर्भ


157

मैं उबंटू के लिए बहुत नया हूं, लेकिन मुझे यह काम करने के लिए नहीं मिल सकता है। यह मेरे स्कूल के कंप्यूटरों पर ठीक काम करता है और मुझे नहीं पता कि मैं क्या नहीं कर रहा हूँ। मैंने usr / शामिल किया है और time.h वहाँ ठीक है। यहाँ कोड है:

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    //do stuff here
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    return 0;
}

मैं अपने IDE के रूप में और साथ ही चलाने के लिए CodeBlocks का उपयोग कर रहा हूं। कोई मदद महान होगा, धन्यवाद।


आप भी अक्सर की जरूरत -D_XOPEN_SOURCE=600है। इसके अलावा GCC को -std = c99 के साथ देखें, जो कि टाइमपास के बारे में नहीं जानता है
jww

जवाबों:


285

-lrtG ++ कमांड लाइन के अंत में जोड़ें । यह पुस्तकालय "रियल टाइम" साझा पुस्तकालय में लिंक करता है।


अगर मैं मैन्युअल रूप से संकलित करता हूं तो यह काम करता है - किसी भी विचार को मैं कैसे कोडब्लॉक में स्वचालित करता हूं?
naspinski

7
प्रोजेक्ट की कोशिश करें -> बिल्ड विकल्प -> लिंकर सेटिंग्स; फिर पुस्तकालय आरटी
दिमित्री युडाकोव

आपका सुझाव मेरे लिए ठीक काम करता है..मैं नया हूँ C... क्या करता -lrtहै?
नौफ़ल

3
क्षमा करें यह इस संयुक्त में noob अप करने के लिए, लेकिन आप उस इस्तेमाल कर सकते हैं एक पूरा उदाहरण में, somehing की तरह g++ -o main -lrt main.cppनहीं मेरे लिए काम करता है
PUK

4
@puk डालने का प्रयास -lrtकरने के बाद main.cppसाझा पुस्तकालयों के आदेश बात - - देखना यह या कि अधिक जानकारी के लिए
दिमित्री Yudakov

42

उदाहरण:

c++ -Wall filefork.cpp -lrt -O2

के लिए gccसंस्करण 4.6.1, -lrtहोना चाहिए के बाद filefork.cpp अन्यथा आप एक लिंक त्रुटि मिलती है।

कुछ पुराने gccसंस्करण स्थिति की परवाह नहीं करते हैं।


9
धन्यवाद, -lrtसही स्थिति में नहीं होने के कारण मुझे सिरदर्द हो रहा था। क्या इस पागल के लिए कोई प्रेरणा है (अच्छी तरह से, कई अपराधी कहते हैं) सेटिंग?
Avio

@ एवियो - ऐतिहासिक कारणों से आदेश मायने रखता है। संकलक प्रत्येक तर्क को क्रम में संसाधित करने के लिए उपयोग किया जाता है। क्योंकि पुस्तकालय "नरम" संदर्भ होते हैं, क्योंकि *.oतर्कों में "कठिन" संदर्भों के विपरीत , पुस्तकालय के कार्यों को अनदेखा किया जाता है जब तक कि उन्हें पहले संदर्भित नहीं किया जाता है, जिसका अर्थ है बाईं ओर।
मार्क लकाटा

28

2.17 संस्करण के बाद से, लाइब्रेरी लिंकिंग -lrtकी अब आवश्यकता नहीं है।

clock_*अब मुख्य सी पुस्तकालय का हिस्सा हैं। आप glibc 2.17 का परिवर्तन इतिहास देख सकते हैं जहाँ यह परिवर्तन किया गया था जो इस परिवर्तन का कारण बताता है:

+* The `clock_*' suite of functions (declared in <time.h>) is now available
+  directly in the main C library.  Previously it was necessary to link with
+  -lrt to use these functions.  This change has the effect that a
+  single-threaded program that uses a function such as `clock_gettime' (and
+  is not linked with -lrt) will no longer implicitly load the pthreads
+  library at runtime and so will not suffer the overheads associated with
+  multi-thread support in other code such as the C++ runtime library.

यदि आप glibc को अपग्रेड करने का निर्णय लेते हैं, तो आप glibc के संगतता ट्रैकर की जांच कर सकते हैं यदि आप चिंतित हैं कि क्या नए glibc का उपयोग करके कोई समस्या होगी।

सिस्टम पर स्थापित glibc संस्करण की जाँच करने के लिए, कमांड चलाएँ:

ldd --version

(बेशक, यदि आप पुराने ग्लिबक का उपयोग कर रहे हैं (<2.17) तो आपको अभी भी आवश्यकता होगी -lrt।)


26

मुझे उसी त्रुटि का सामना करना पड़ा। मेरे लिंकर कमांड में rt लाइब्रेरी शामिल थी -lrtजो सही है और यह थोड़ी देर के लिए काम कर रहा था। कुबंटू को फिर से स्थापित करने के बाद इसने काम करना बंद कर दिया।

एक अलग फोरम थ्रेड ने -lrtप्रोजेक्ट ऑब्जेक्ट फ़ाइलों के बाद आने की आवश्यकता का सुझाव दिया । चलती -lrtकमांड के अंत में मेरे लिए यह समस्या ठीक हो गई, हालांकि मैं क्यों का विवरण पता नहीं है।


7
Ircnet से दो किमी का उद्धरण: लिंकर केवल आवश्यक प्रतीकों की एक सूची रखता है। एक बार एक फ़ाइल के प्रतीकों को खोजा गया है, केवल उसी चीज़ को रखा गया है, जो वह प्रदान करता है उसे छोड़ दिया जाता है और यह अगले फ़ाइल नाम पर चला जाता है। इसलिए बाएं से दाएं, लेकिन बहुत भुलक्कड़।
व्यक्त करते
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.