Неопределенная ссылка 'shm_open', уже добавьте флаг -lrt здесь

У меня просто сбой системы и переустановка Ubuntu 11.10, и мой код выдает эту странную ошибку.

Я написал простой пример кода, чтобы проверить, где проблема:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main (void) {

    int i;

    i = shm_open ("/tmp/shared", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);   printf ("shm_open rc = %d\n", i);

    shm_unlink ("/tmp/shared");

    return (0);
}

и команда компиляции

gcc -lrt test.c -o test

Ошибка:

/tmp/ccxVIUiP.o: In function `main':
test.c:(.text+0x21): undefined reference to `shm_open'
test.c:(.text+0x46): undefined reference to `shm_unlink'
collect2: ld returned 1 exit status

Я уже добавил -lrt lib, почему он все еще не компилируется?

4 ответа

Решение

Библиотеки в конце:

gcc test.c -o test -lrt

Из GCC Link Options:

-llibrary
-l библиотека
    Поиск библиотеки по имени библиотеки при связывании. 
    (Второй вариант с библиотекой в ​​качестве отдельного аргумента
    только для соответствия POSIX и не рекомендуется.)

    Имеет значение, где в команде вы пишете эту опцию;
    компоновщик ищет и обрабатывает библиотеки и объектные файлы в
    порядок они указаны.
    Таким образом, `foo.o -lz bar.o'ищет библиотеку`z' после файла foo.o, но
    до бара Если bar.o ссылается на функции в `z', эти функции
    не может быть загружен.

Измените строку компиляции с

gcc -lrt test.c -o test

в

gcc test.c -o test -lrt

В Expert C programming Страница 108:<Handy Heuristic> Where to Put Library Options:Always put the -l library options at the rightmost end of your compilation command line.Но это не говорит почему, так что я думаю, что это в некоторой степени правило?:)

Для тех из вас, кто использует суперавтомагический CMAKE, как я, попробуйте добавить:

      target_link_libraries(your_binary_name PRIVATE librt.so)

в ваш CMakeLists.txt

Или замените PRIVATE на PUBLIC при необходимости.


Если у вас есть хорошо установленные пути к библиотекам (например, все необходимые библиотеки в / usr / lib), вы можете просто указать в CMakeLists.txt:

set(CMAKE_CXX_FLAGS "-lrt")

Другие вопросы по тегам