首页 > 解决方案 > 导入时对 POSIX 函数的未定义引用

问题描述

我只是用计时器创建一个线程。即使我导入了我需要的所有库。它一直告诉我们没有对函数的引用。

正是它说的timer_create(...)并且timer_settime(...)没有被引用。

这些是我的进口:

#include <stdio.h>
#include <stddef.h>
#include <sched.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

这是我使用这些函数的线程:

void *Turismo(){
    const struct timespec periodo = {per_turismos_sec,per_turismos_nsec};
    struct sigevent event;
    timer_t timer;
    struct itimerspec its;
    sigset_t sigset;
    int signum;

    event.sigev_notify = SIGEV_SIGNAL;
    event.sigev_signo = SIGRTMAX;
    event.sigev_value.sival_ptr = &timer;

    if(timer_create(CLOCK_MONOTONIC,&event,&timer)!=0) error();

    its.it_interval = periodo;
    its.it_value.tv_sec = 0;
    its.it_value.tv_nsec = 1;

    if(timer_settime(timer,0,&its,NULL)<0) error();
    if(sigemptyset(&sigset)<0) error();
    if(sigaddset(&sigset,SIGRTMAX)<0) error();


    while(1){
        sigwait(&sigset,&signum);
        // ESPECIFICACION DE LA TAREA

    }

    if(timer_delete(timer)<0) error();
    return NULL;
}

代码不完整,无法更正。

对于编译,我使用下一个命令:

gcc -o ejer1 ejer1.c -lpthread

我会很感激一些帮助。谢谢!

标签: ctimetimerposixreal-time

解决方案


构建程序有两个阶段

  • 汇编
  • 连锁

在这个compilation阶段,您需要知道构建文件的函数和结构的声明。.o

在这个linkage阶段,您需要实际实现这些功能。

未定义的引用错误告诉您链接器找不到函数的实现。

因为您使用第三方库,所以您需要将该库与-l密钥链接。

要检查库是否有符号,您可以执行

$ nm -gD /usr/lib/x86_64-linux-gnu/librt.so | grep timer_create
0000000000004520 T timer_create
00000000000042a0 T timer_create

在您的情况下,您需要将rt库与-lrt密钥链接。


推荐阅读