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 퍼팅 시도 -lrt후 main.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.