Kesalahan C ++: referensi yang tidak ditentukan untuk 'clock_gettime' dan 'clock_settime'

157

Saya cukup baru di Ubuntu, tetapi sepertinya saya tidak bisa menjalankannya. Ini berfungsi baik di komputer sekolah saya dan saya tidak tahu apa yang tidak saya lakukan. Saya telah memeriksa usr / include dan time.h apakah ada apa-apa. Ini kodenya:

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

Saya menggunakan CodeBlocks sebagai IDE saya untuk membangun dan menjalankan juga. Bantuan apa pun akan bagus, terima kasih.

naspinski
sumber
Anda sering perlu -D_XOPEN_SOURCE=600juga. Lihat juga GCC dengan -std = c99 mengeluh tentang tidak mengetahui struct timespec .
jww

Jawaban:

285

Tambahkan -lrtke akhir baris perintah g ++. Tautan ini di librt.so pustaka bersama "Real Time".

Dmitry Yudakov
sumber
yang berfungsi jika saya mengkompilasi secara manual - ada ide bagaimana saya mengotomatiskan itu dalam kode kunci?
naspinski
7
coba Proyek -> Opsi Bangun -> Pengaturan Linker; lalu tambahkan perpustakaan rt
Dmitry Yudakov
Saran Anda bekerja dengan baik untuk saya .. Saya baru C... apa fungsinya -lrt?
noufal
3
Maaf untuk noob di sambungan ini, tetapi bisakah Anda menggunakannya dalam contoh lengkap, sesuatu seperti g++ -o main -lrt main.cpptidak bekerja untuk saya
puk
4
@puk Coba letakkan -lrtsetelah main.cpp- urutan masalah perpustakaan bersama - lihat ini atau itu untuk lebih jelasnya
Dmitry Yudakov
42

contoh:

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

Untuk gccversi 4.6.1, -lrtharus setelah filefork.cpp jika tidak Anda mendapatkan kesalahan tautan.

Beberapa gccversi yang lebih lama tidak peduli dengan posisi tersebut.

jing kang
sumber
9
Terima kasih, -lrttidak berada di posisi yang benar membuat saya sakit kepala. Apakah ada motivasi untuk pengaturan gila ini (well, banyak yang mengatakan kriminal)?
Avio
@ Avi - urutan penting karena alasan historis. Compiler digunakan untuk hanya memproses setiap argumen secara berurutan. Karena perpustakaan adalah referensi "lunak", yang bertentangan dengan referensi "keras" dalam *.oargumen, fungsi perpustakaan diabaikan kecuali jika direferensikan sebelumnya, yang berarti, ke kiri.
Mark Lakata
28

Sejak glibc versi 2.17, penautan pustaka -lrttidak lagi diperlukan.

The clock_*kini menjadi bagian dari perpustakaan C utama. Anda dapat melihat riwayat perubahan glibc 2.17 di mana perubahan ini dilakukan menjelaskan alasan perubahan ini:

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

Jika Anda memutuskan untuk memutakhirkan glibc, maka Anda dapat memeriksa pelacak kompatibilitas glibc jika Anda khawatir apakah akan ada masalah menggunakan glibc yang lebih baru.

Untuk memeriksa versi glibc yang diinstal pada sistem, jalankan perintah:

ldd --version

(Tentu saja, jika Anda menggunakan glibc lama (<2.17) maka Anda masih perlu -lrt.)

PP
sumber
26

Saya mengalami kesalahan yang sama. Perintah linker saya memang menyertakan pustaka rt -lrtmana yang benar dan itu berfungsi untuk sementara waktu. Setelah menginstal ulang Kubuntu berhenti bekerja.

Sebuah utas forum terpisah menyarankan -lrtperlunya datang setelah file objek proyek. Memindahkan -lrtke akhir perintah memperbaiki masalah ini untuk saya meskipun saya tidak tahu detailnya.

Adam
sumber
7
Mengutip twkm dari ircnet: linker hanya menyimpan daftar simbol yang diperlukan. setelah simbol file dicari, hanya apa yang dibutuhkan disimpan, apa yang disediakannya dibuang dan dipindahkan ke nama file berikutnya. jadi dari kiri ke kanan, tapi sangat pelupa.
domen