web-dev-qa-db-ja.com

C ++エラー:「clock_gettime」および「clock_settime」への未定義の参照

私はUbuntuにはかなり慣れていませんが、これを機能させることはできません。私の学校のコンピューターでは問題なく動作し、何をしていないのかわかりません。 sr/includeをチェックしましたが、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;
}

CodeBlocksをIDEとして使用してビルドおよび実行もしています。どんな助けも素晴らしいでしょう、ありがとう。

150
naspinski

-lrtをg ++コマンドラインの最後に追加します。これは、librt.soの「リアルタイム」共有ライブラリにリンクします。

273
Dmitry Yudakov

例:

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

gccバージョン4.6.1の場合、-lrtafterfilefork.cppでなければなりません。そうしないと、リンクエラーが発生します。

古いバージョンのgccバージョンは位置を気にしません。

41
jing kang

同じエラーが発生しました。私のリンカーコマンドには、-lrtが含まれているrtライブラリがありましたが、これは正しく、しばらく動作していました。 Kubuntuを再インストールした後、動作しなくなりました。

別のフォーラムスレッドは、プロジェクトオブジェクトファイルの後に来る必要がある-lrtを提案しました。 -lrtをコマンドの最後に移動すると、この問題は修正されましたが、理由の詳細はわかりません。

26
Adam

Glibc 2.17以降、-rtをリ​​ンクするライブラリは不要になりました。

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が必要になります。)

25
P.P.