ข้อผิดพลาด C ++: การอ้างอิงที่ไม่ได้กำหนดกับ 'clock_gettime' และ 'clock_settime'


157

ฉันค่อนข้างใหม่กับ Ubuntu แต่ดูเหมือนจะใช้งานไม่ได้ มันทำงานได้ดีบนคอมพิวเตอร์ของโรงเรียนและฉันไม่รู้ว่าฉันไม่ได้ทำอะไร ฉันได้ตรวจสอบusr / includeแล้วและเวลามันก็โอเค นี่คือรหัส:

#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;
}

ฉันใช้ CodeBlocks เป็น IDE ของฉันเพื่อสร้างและเรียกใช้เช่นกัน ความช่วยเหลือใด ๆ จะดีขอขอบคุณ.


คุณก็ต้องการ-D_XOPEN_SOURCE=600เช่นกัน ยังเห็นGCC กับ -std = c99 บ่นเรื่องไม่ทราบว่า struct timespec
jww

คำตอบ:


285

เพิ่ม-lrtที่ส่วนท้ายของบรรทัดคำสั่ง g ++ ลิงก์นี้ใน librt.so เพื่อแชร์ไลบรารี "เรียลไทม์"


มันทำงานได้ไหมถ้าฉันคอมไพล์ด้วยตนเอง - มีความคิดใดที่ฉันทำมันโดยอัตโนมัติในโค๊ดบล็อค?
naspinski

7
ลอง Project -> Build Options -> Settings Linker; จากนั้นเพิ่มไลบรารี rt
Dmitry Yudakov

ข้อเสนอแนะของคุณทำงานได้ดีสำหรับฉัน .. ฉันยังใหม่กับC... สิ่งที่จะ-lrtทำอย่างไร
noufal

3
ขออภัยที่ noob ขึ้นในกิจการร่วมค้านี้ แต่คุณอาจจะใช้ที่ในตัวอย่างที่สมบูรณ์, somehing เหมือนg++ -o main -lrt main.cppไม่ทำงานสำหรับฉัน
ปึก

4
@puk ลองวาง-lrtหลังmain.cpp- คำสั่งของห้องสมุดสาธารณะเรื่อง - ดูนี้หรือว่าสำหรับรายละเอียดเพิ่มเติม
Dmitry Yudakov

42

ตัวอย่าง:

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

สำหรับgccเวอร์ชัน 4.6.1 -lrtต้องอยู่หลัง filefork.cpp ไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดลิงก์

gccรุ่นเก่าบางรุ่นไม่สนใจตำแหน่ง


9
ขอบคุณการ-lrtไม่อยู่ในตำแหน่งที่ถูกต้องทำให้ฉันปวดหัว มีแรงจูงใจสำหรับการตั้งค่าที่บ้าคลั่ง
Avio

@Avio - ลำดับสำคัญสำหรับเหตุผลทางประวัติศาสตร์ คอมไพเลอร์ใช้ในการประมวลผลแต่ละอาร์กิวเมนต์ตามลำดับ เนื่องจากไลบรารีเป็นการอ้างอิงแบบ "เบา" ซึ่งต่างจากการอ้างอิงแบบ "ยาก" ใน*.oอาร์กิวเมนต์ฟังก์ชันของไลบรารีจะถูกละเว้นเว้นแต่ว่าจะถูกอ้างอิงก่อนหน้านี้ซึ่งหมายถึงด้านซ้าย
Mark Lakata

28

ตั้งแต่ glibc เวอร์ชั่น 2.17 การเชื่อมโยงไลบรารี-lrtไม่จำเป็นอีกต่อไป

clock_*ตอนนี้เป็นส่วนหนึ่งของห้องสมุด C หลัก คุณสามารถดูประวัติการเปลี่ยนแปลงของ 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

(แน่นอนถ้าคุณใช้ glibc เก่า (<2.17) คุณจะยังคงต้องการ-lrt)


26

ฉันพบข้อผิดพลาดเดียวกัน คำสั่ง linker ของฉันมีไลบรารี rt รวมอยู่ด้วย-lrtซึ่งถูกต้องและใช้งานได้ระยะหนึ่ง หลังจากติดตั้ง Kubuntu อีกครั้งมันหยุดทำงาน

เธรดฟอรัมที่แยกต่างหากชี้ให้เห็นว่า-lrtจำเป็นต้องมาหลังจากไฟล์อ็อบเจ็กต์โปรเจ็กต์ การย้าย-lrtไปยังจุดสิ้นสุดคำสั่งแก้ไขปัญหานี้ให้ฉันแม้ว่าฉันจะไม่ทราบรายละเอียดว่าทำไม


7
การอ้างถึง twkm จาก ircnet: ตัวเชื่อมโยงจะเก็บรักษารายการสัญลักษณ์ที่จำเป็นเท่านั้น เมื่อสัญลักษณ์ของไฟล์ถูกค้นหาสิ่งที่จำเป็นต้องมีก็คือสิ่งที่มันถูกทิ้งและมันจะย้ายไปยังชื่อไฟล์ต่อไป จากซ้ายไปขวา แต่ลืมไปมาก
domen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.