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


157

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

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


あなたもしばしば必要-D_XOPEN_SOURCE=600です。また、-std = c99を指定したGCCで、struct timespecがわからないというメッセージが表示されます。
jww 2018

回答:


285

-lrtg ++コマンドラインの最後に追加します。これは、librt.so "Real Time"共有ライブラリにリンクしています。


手動でコンパイルすると機能します-コードブロックでそれを自動化する方法はありますか?
naspinski 2010年

7
プロジェクト->ビルドオプション->リンカ設定を試してください。次にライブラリrtを追加します
Dmitry Yudakov

あなたの提案は私にとってはうまくC機能し-lrtます。
2013年

3
このジョイントでそれをnoobして申し訳ありませんが、完全な例でそれを使用できますか?somehing like g++ -o main -lrt main.cppは私には機能しません
puk

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 2012

@Avio-順序は歴史的な理由で重要です。コンパイラーは、各引数を順番に処理するだけでした。ライブラリは、*.o引数の「ハード」参照とは対照的に「ソフト」参照であるため、ライブラリ関数は、以前に、つまり左側に参照されていない限り無視されます。
Mark Lakata、2014年

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

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

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


7
ircnetからtwkmを引用:リンカは必要なシンボルのリストのみを維持します。ファイルのシンボルが検索されると、必要なものだけが保持され、ファイルが提供するものは破棄され、次のファイル名に移動します。左から右ですが、とても忘れやすいです。
domen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.