2010-03-10 37 views
136

Tôi khá mới đối với Ubuntu, nhưng dường như tôi không thể làm việc này. Nó hoạt động tốt trên máy tính trường học của tôi và tôi không biết những gì tôi không làm. Tôi đã kiểm tra usr/bao gồm và time.h là có tốt. Đây là mã:Lỗi Ubuntu Linux C++: tham chiếu không xác định đối với 'clock_gettime' và 'clock_settime'

#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 để xây dựng và chạy. Bất kỳ trợ giúp sẽ là tuyệt vời, cảm ơn bạn.

Trả lời

250

Thêm -lrt vào cuối dòng lệnh g ++. Liên kết này trong thư viện được chia sẻ trong thư viện được chia sẻ của librt.so "Real Time".

+0

mà làm việc nếu tôi biên dịch thủ công - bất kỳ ý tưởng làm thế nào tôi tự động hóa trong codeblocks? – naspinski

+7

thử Dự án -> Tùy chọn Xây dựng -> Cài đặt Trình liên kết; sau đó thêm thư viện rt –

+0

Đề xuất của bạn hoạt động tốt cho tôi .. Tôi mới dùng 'C' ...' -lrt'do là gì? – noufal

26

Tôi gặp phải lỗi tương tự. Lệnh liên kết của tôi đã có thư viện rt bao gồm -lrt đúng và đã hoạt động trong một thời gian. Sau khi cài đặt lại Kubuntu nó ngừng hoạt động.

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

+1

Bạn có thể đăng liên kết đến chuỗi diễn đàn không? –

+5

Trích dẫn twkm từ ircnet: trình liên kết chỉ duy trì danh sách các biểu tượng cần thiết. một khi các biểu tượng của một tập tin đã được tìm kiếm, chỉ những gì nó cần được giữ lại, những gì nó cung cấp bị loại bỏ và nó chuyển sang tên tập tin tiếp theo. từ trái sang phải, nhưng rất quên. – domen

41

dụ:

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

Đối gcc phiên bản 4.6.1, -lrt phải saufilefork.cpp nếu không bạn nhận được một lỗi liên kết.

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

+9

Cảm ơn bạn, '-lrt' không ở đúng vị trí đã khiến tôi đau đầu. Có bất kỳ động cơ nào cho sự điên rồ này (tốt, nhiều người nói là tội phạm) không? – Avio

+0

@Avio - thứ tự quan trọng vì lý do lịch sử. Trình biên dịch được sử dụng để xử lý từng đối số theo thứ tự. 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 đối số '* .o', 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. –

23

Vì glibc 2.17, thư viện liên kết -rt không còn cần thiết nữa.

clock_* hiện là một phần của thư viện C chính. Bạn có thể xem change history of glibc 2.17 nơi sự 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, sau đó bạn có thể kiểm tra compatibility tracker of glibc nếu bạn đang quan tâm liệu sẽ có bất kỳ vấn đề bằng cách sử dụng phiên bản mới hơn glibc.

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

ldd --version 

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

+1

thực sự là thông tin phù hợp, rất hữu ích – cpp11dev

Các vấn đề liên quan