导入时对 POSIX 函数的未定义引用
Undefined reference to POSIX functions when they're imported
我只是在创建一个带有计时器的线程。即使我导入了我需要的所有库。一直提示没有引用函数。
确切地说,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
我希望得到一些帮助。谢谢!
构建程序有两个阶段
- 编译
- 联动
在compilation
阶段,您需要了解声明函数和结构以构建.o
文件。
在linkage
阶段,您需要实际实现功能。
未定义引用 错误告诉您 linker 找不到函数的实现。
因为您使用的是第三方库,所以您需要 link 使用 -l
密钥的库。
要检查库是否有符号,可以执行
$ nm -gD /usr/lib/x86_64-linux-gnu/librt.so | grep timer_create
0000000000004520 T timer_create
00000000000042a0 T timer_create
在您的情况下,您需要 link rt
带有 -lrt
密钥的库。
我只是在创建一个带有计时器的线程。即使我导入了我需要的所有库。一直提示没有引用函数。
确切地说,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
我希望得到一些帮助。谢谢!
构建程序有两个阶段
- 编译
- 联动
在compilation
阶段,您需要了解声明函数和结构以构建.o
文件。
在linkage
阶段,您需要实际实现功能。
未定义引用 错误告诉您 linker 找不到函数的实现。
因为您使用的是第三方库,所以您需要 link 使用 -l
密钥的库。
要检查库是否有符号,可以执行
$ nm -gD /usr/lib/x86_64-linux-gnu/librt.so | grep timer_create
0000000000004520 T timer_create
00000000000042a0 T timer_create
在您的情况下,您需要 link rt
带有 -lrt
密钥的库。