Lỗi C ++: tham chiếu không xác định đến 'clock_gettime' và 'clock_settime'


157

Tôi khá mới với Ubuntu, nhưng dường như tôi không thể làm việc này được. Nó hoạt động tốt trên máy tính của trường tôi và tôi không biết mình không làm gì. Tôi đã kiểm tra usr / bao gồm và time.h ở đó là tốt. Đây là mã:

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

Tôi đang sử dụng CodeBlocks làm IDE của mình để xây dựng và chạy. Bất kỳ trợ giúp sẽ là tuyệt vời, cảm ơn bạn.


Bạn cũng cần thường xuyên -D_XOPEN_SOURCE=600. Cũng xem GCC với -std = c99 phàn nàn về việc không biết struct timespec .
jww

Câu trả lời:


285

Thêm -lrtvào cuối dòng lệnh g ++. Liên kết này trong thư viện chia sẻ "Thời gian thực" của librt.so.


nó hoạt động nếu tôi biên dịch thủ công - có ý tưởng nào tôi tự động hóa nó trong codeblocks không?
naspinski

7
thử Project -> Build Options -> Linker Settings; sau đó thêm thư viện rt
Dmitry Yudakov

Đề xuất của bạn hoạt động tốt cho tôi..Tôi mới biết C... -lrtlàm gì?
noufal

3
Xin lỗi để noob nó trong khớp này, nhưng bạn có thể sử dụng nó trong một ví dụ hoàn chỉnh, một số cách như g++ -o main -lrt main.cppkhông làm việc cho tôi
puk

4
@puk Hãy thử đặt -lrtsau main.cpp- thứ tự các thư viện dùng chung có vấn đề - hãy xem cái này hoặc cái kia để biết thêm chi tiết
Dmitry Yudakov

42

thí dụ:

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

Đối với gccphiên bản 4.6.1, -lrtphải sau filefork.cpp nếu không bạn sẽ gặp lỗi liên kết.

Một số gccphiên bản cũ không quan tâm đến vị trí.


9
Cảm ơn bạn, việc -lrtkhông ở đúng vị trí đã khiến tôi đau đầu. Có bất kỳ động lực cho thiết lập điên rồ (tốt, nhiều người nói) này?
Avio

@Avio - thứ tự quan trọng vì lý do lịch sử. Trình biên dịch được sử dụng để chỉ xử lý từng đối số theo thứ tự. Bởi vì các thư viện là các tham chiếu "mềm", trái ngược với các tham chiếu "cứng" trong các *.ođối số, các hàm thư viện bị bỏ qua trừ khi chúng được tham chiếu trước đó, có nghĩa là, ở bên trái.
Đánh dấu Lakata

28

Kể từ phiên bản glibc 2.17, thư viện liên kết -lrt không còn cần thiết nữa.

Các clock_*hiện nay là một phần của thư viện C chính. Bạn có thể thấy lịch sử thay đổi của glibc 2.17 trong đó thay đổi này được thực hiện giải thích lý do cho sự thay đổi này:

+* 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.

Nếu bạn quyết định nâng cấp glibc, thì bạn có thể kiểm tra trình theo dõi tương thích của glibc nếu bạn lo ngại liệu có bất kỳ vấn đề nào khi sử dụng glibc mới hơn không.

Để kiểm tra phiên bản glibc được cài đặt trên hệ thống, hãy chạy lệnh:

ldd --version

(Tất nhiên, nếu bạn đang sử dụng glibc cũ (<2.17) thì bạn vẫn sẽ cần -lrt.)


26

Tôi gặp lỗi tương tự. Lệnh linker của tôi đã bao gồm thư viện rt-lrt đúng và nó đã hoạt động được một lúc. Sau khi cài đặt lại Kubfox, nó ngừng hoạt động.

Một chủ đề diễn đàn riêng biệt đề xuất sự -lrtcần thiết phải đến sau các tệp đối tượng dự án. Việc chuyển -lrtđến cuối lệnh đã khắc phục vấn đề này cho tôi mặc dù tôi không biết chi tiết tại sao.


7
Trích dẫn twkm từ ircnet: trình liên kết chỉ duy trì một danh sách các biểu tượng cần thiết. một khi các ký hiệu của tệp đã được tìm kiếm, chỉ những gì nó cần được giữ lại, những gì nó cung cấp sẽ bị loại bỏ và nó chuyển sang tên tệp tiếp theo. nên trái sang phải, nhưng rất hay quên.
domen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.