Неопределенная ссылка на функцию в другой библиотеке - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь скомпилировать объектный код со ссылкой на одну библиотеку. Это код 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'

Кто-нибудь знает, что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 26 января 2012

Добавьте -lrt к вашей команде ссылки.timer_create и timer_settime не являются частью стандартной библиотеки C.

gcc -fPIC -shared libexample.c -lrt -o libexample.so
gcc -L. example.c -lexample -o example
1 голос
/ 26 января 2012

Команда 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 , вам нужно привести библиотеки в порядок после всех остальных (обычный порядок для аргументов gcc - исходные файлы, объектные файлы, библиотеки в порядке зависимости) в gcc или ld команды (и это задокументировано в документации ld и в gcc). Так что -lrt должно идти последним.

И научитесь читать справочные страницы.

1 голос
/ 26 января 2012

Похоже, вы забыли связать в библиотеке, которая определяет timer_create и timer_settime - вам нужно добавить -lrt к вашей команде gcc.

(источник: http://www.kernel.org/doc/man-pages/online/pages/man2/timer_create.2.html)

0 голосов
/ 14 июня 2017

Если вы используете cmake, убедитесь, что вы включили библиотеки, используя target_link_libraries().Например, для функций таймера, таких как timer_create(), вам нужно "rt", а для pthread вам нужно "pthread", добавленных с помощью target_link_libraries().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...