본문 바로가기

개발자/Linux 리눅스

리눅스 타이머 사용할 때 undefined reference to `timer_create' 에러 발생




리눅스 타이머 시용할때 다음과 같은 에러 생기면 뒤에 뒤에 라이브러리 포함 -lrt 넣어줘야 함.


 

1
2
3
4
5
6
pi@raspberrypi:~/timertest $ gcc -o multitimer multitimer.c
/tmp/ccgVf2H0.o: In function `makeTimer':
multitimer.c:(.text+0x13c): undefined reference to `timer_create'
multitimer.c:(.text+0x18c): undefined reference to `timer_settime'
collect2: error: ld returned 1 exit status
 
cs


이렇게 에러가 나면 컴파일 옵션 뒤에 -lrt 붙혀준다.


pi@raspberrypi:~/timertest $ gcc -o multitimer multitimer.c -lrt

pi@raspberrypi:~/timertest $ sudo ./multitimer



다음은 멀티 타이머 사용 소스코드


$nano multitimer.c


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
 
timer_t firstTimerID;
timer_t secondTimerID;
timer_t thirdTimerID;
 
static void timerHandler( int sig, siginfo_t *si, void *uc )
{
    timer_t *tidp;
    tidp = (void**)(si->si_value.sival_ptr);
    if ( *tidp == firstTimerID )
        printf("2ms\n");
    else if ( *tidp == secondTimerID )
        printf("10ms\n");
    else if ( *tidp == thirdTimerID )
        printf("100ms\n");
}
 
static int makeTimer( timer_t *timerID, int expireMS, int intervalMS )
{
    struct sigevent te;
    struct itimerspec its;
    struct sigaction sa;
    int sigNo = SIGRTMIN;
 
    /* Set up signal handler. */
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = timerHandler;
    sigemptyset(&sa.sa_mask);
    if (sigaction(sigNo, &sa, NULL) == -1) {
        perror("sigaction");
    }
 
    /* Set and enable alarm */
    te.sigev_notify = SIGEV_SIGNAL;
    te.sigev_signo = sigNo;
    te.sigev_value.sival_ptr = timerID;
    timer_create(CLOCK_REALTIME, &te, timerID);
 
    its.it_interval.tv_sec = 0;
    its.it_interval.tv_nsec = intervalMS * 1000000;
    its.it_value.tv_sec = 0;
    its.it_value.tv_nsec = expireMS * 1000000;
    timer_settime(*timerID, 0, &its, NULL);
 
    return 1;
}
 
int main()
{
    makeTimer(&firstTimerID, 500, 500); //2ms
    makeTimer(&secondTimerID,900, 900); //10ms
    //makeTimer(&thirdTimerID, 100, 100); //100ms
 
    while(1)
    {
 
    }
 
    return 0;
}
cs


컴파일과 실행


 $ gcc -o multitimer multitimer.c -lrt


 $ sudo ./multitimer