C ++ 오류 : 'clock_gettime'및 'clock_settime'에 대한 정의되지 않은 참조


157

나는 우분투를 처음 접했지만 이것이 작동하지 않는 것 같습니다. 학교 컴퓨터에서 잘 작동하며 내가 뭘하지 않는지 모르겠습니다. 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 불만에 대한 구조체 timespec이 모르고와 GCC를 .
jww

답변:


285

-lrtg ++ 명령 줄 끝에 추가하십시오 . librt.so "실시간"공유 라이브러리에 링크되어 있습니다.


수동으로 컴파일하면 작동합니다-코드 블록에서 자동화하는 방법에 대한 아이디어가 있습니까?
naspinski

7
프로젝트-> 빌드 옵션-> 링커 설정을 시도하십시오. 라이브러리 rt 추가
Dmitry Yudakov

당신의 제안은 저에게 잘 작동합니다. 나는 처음에 C... 무엇을 -lrt합니까?
noufal

3
죄송이 공동으로 그것을 멍청한 놈,하지만 당신은 같은 somehing, 완벽한 예제에서 사용할 수 있습니다 g++ -o main -lrt main.cpp나를 위해 일을하지 않습니다
PUK

4
@puk 퍼팅 시도 -lrtmain.cpp문제 공유 라이브러리의 순서 - - 볼 또는 자세한 내용은
드미트리 Yudakov

42

예:

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

들어 gcc버전 4.6.1, -lrt해야합니다 filefork.cpp 그렇지 않으면 링크 오류가 발생합니다.

일부 이전 gcc버전은 위치를 신경 쓰지 않습니다.


9
고맙습니다 -lrt. 올바른 자세에 있지 않으면 두통이 생겼습니다. 이 미친 (잘, 많은 사람들이 범죄자라고 말하는) 환경에 동기가 있습니까?
Avio

@Avio-순서는 역사적인 이유로 중요합니다. 컴파일러는 각 인수를 순서대로 처리하는 데 사용됩니다. 라이브러리는 *.o인수 에서 "하드"참조와 달리 "소프트"참조이므로 라이브러리 함수는 이전에 참조 되지 않은 경우 ( 즉, 왼쪽) 참조 되지 않는 한 무시 됩니다 .
Mark Lakata 21

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

같은 오류가 발생했습니다. 내 링커 명령에는 -lrt올바른 rt 라이브러리가 포함되어 있으며 잠시 동안 작동했습니다. Kubuntu를 다시 설치 한 후 작동이 중지되었습니다.

별도의 포럼 스레드 -lrt는 프로젝트 객체 파일 뒤에 올 필요가 있다고 제안했습니다 . -lrt명령의 끝으로 이동하면 이유에 대한 세부 정보를 모르지만이 문제가 해결되었습니다.


7
ircnet에서 twkm 인용 : 링커는 필요한 심볼 목록 만 유지합니다. 파일의 심볼이 검색되면 필요한 것만 유지하고 제공하는 것은 버리고 다음 파일 이름으로 이동합니다. 왼쪽에서 오른쪽이지만 매우 잊어 버렸습니다.
domen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.