undefined reference 'shm_open', already add -lrt flag here

I just have a system crash and reinstall Ubuntu 11.10, and my code produces this strange error.

I wrote a simple code sample to test where the problem is:

#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);
}

and the compile command is

gcc -lrt test.c -o test

The error is:

/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

I have already added -lrt lib, why does it still not compile?

5

4 Answers

Libraries at the end:

gcc test.c -o test -lrt

From GCC Link Options:

-llibrary
-l library Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.) It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, `foo.o -lz bar.o' searches library `z' after file foo.o but before bar.o. If bar.o refers to functions in `z', those functions may not be loaded.
6

Change the compile line from

gcc -lrt test.c -o test

to

gcc test.c -o test -lrt
1

In Expert C programming Page 108:<Handy Heuristic> Where to Put Library Options:Always put the -l library options at the rightmost end of your compilation command line.But it doesn't tell why, so i guess this is somewhat a rule?:)

For those of you using super-auto-magical CMAKE like me, try to add:

target_link_libraries(your_binary_name PRIVATE librt.so)

to your CMakeLists.txt

Alternatively, replace PRIVATE for PUBLIC as needed..


If you have well established paths to libraries (e.g. all needed libs in /usr/lib), you may be fine with just stating in CMakeLists.txt:

set(CMAKE_CXX_FLAGS "-lrt")

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like