Неопределенная ссылка '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")