未定义的引用另一个库中的函数

我试图编译一个对象的代码引用一个库。 这是libexample.c的代码:

#include "libexample.h" #include <signal.h> #include <time.h> timer_t sched; struct itimerspec timer = {{0, 0}, {0, 0}}; void init() { struct sigaction sa; sigemptyset(&sa.sa_mask); sigaction(SIGALRM, &sa, NULL); timer_create(CLOCK_PROCESS_CPUTIME_ID, NULL, &sched); timer_settime(sched, TIMER_ABSTIME, &timer, NULL); } 

以及示例程序的简单代码:

 #include "libexample.h" int main() { init(); return 0; } 

我用这个来编译:

 gcc libexample.c -c -lrt -o libexample.o gcc example.c -lrt ibexample.o -o example 

当我试图编译第二行时,我得到这个:

 ./libexample.so: undefined reference to `timer_create' ./libexample.so: undefined reference to `timer_settime' 

任何人都知道我在做什么错了?

man timer_create命令解释了你:

 NAME timer_create - create a POSIX per-process timer SYNOPSIS #include <signal.h> #include <time.h> int timer_create(clockid_t clockid, struct sigevent *sevp, timer_t *timerid); Link with -lrt. 

所以你应该像文档所说的那样与-lrt链接。

所以使用

  gcc libexample.c -fPIC -shared -o libexample.so -lrt 

产生你的libexample.so

正如undur_gongor所评论的那样,你需要在gccld命令的所有剩余部分( gcc参数的通常顺序是源文件,目标文件,依赖顺序的库)中保持良好的顺序(这在ld文档中有记录,和在gcc )。 所以, -lrt应该走了。

并学习阅读手册页。

-lrt添加到您的链接命令。 timer_createtimer_settime不是C标准库的一部分。

 gcc -fPIC -shared libexample.c -lrt -o libexample.so gcc -L. example.c -lexample -o example 

看起来你忘了在定义timer_create和timer_settime的库中链接 – 你需要添加-lrt到你的gcc命令。

(来源: http : //www.kernel.org/doc/man-pages/online/pages/man2/timer_create.2.html )

如果您使用cmake,请确保使用target_link_libraries()包含这些库。 例如, timer_create()等定时器函数需要"rt"pthread需要使用target_link_libraries()添加"pthread"