C – The makefile used to create libraries in Linux fails to compile

The makefile used to create libraries in Linux fails to compile… here is a solution to the problem.

The makefile used to create libraries in Linux fails to compile

I have 3 files, my_pipe.h, my_pipe.c and main.c, where my_pipe should be a library.

When I compile it in Eclipse, it compiles just fine with no errors, but when I run the following makefile in the terminal and hit make:

exer3:  main.o libmywrapper.a

gcc main.c libmywrapper.a -o exer3 -static -lrt

libmywrapper.a: my_pipe.o

ar rcs libmywrapper.a my_pipe.o

main.o: main.c my_pipe.h

gcc -lpthread -lrt -c main.c

my_pipe.o:  my_pipe.c my_pipe.h

gcc -lpthread -lrt -c my_pipe.c

I see:

a@ubuntu:~/Desktop/myExer$ make
gcc -lpthread -lrt -c main.c
gcc -lpthread -lrt -c my_pipe.c
ar rcs libmywrapper.a my_pipe.o
gcc main.c libmywrapper.a -o exer3 -static -lrt
libmywrapper.a(my_pipe.o): In function `shm_pipe_init':
my_pipe.c:(.text+0x61): undefined reference to `sem_init'
libmywrapper.a(my_pipe.o): In function `shm_pipe_read':
my_pipe.c:(.text+0x17f): undefined reference to `sem_wait'
my_pipe.c:(.text+0x196): undefined reference to `sem_getvalue'
my_pipe.c:(.text+0x1ba): undefined reference to `sem_wait'
libmywrapper.a(my_pipe.o): In function `shm_pipe_write':
my_pipe.c:(.text+0x4b7): undefined reference to `sem_post'
collect2: ld returned 1 exit status
make: *** [exer3] Error 1

Know what’s wrong with makefile?

Thanks

Updated, above!

Solution

Linker options such as –lpthread and -lrt must be placed at the end of the compilation line. Try:

gcc main.o libmywrapper.a -o exer3 -static -lrt

At compile time, you do not need the linker flag. For example:

main.o: main.c my_pipe.h
  gcc -c main.c

Related Problems and Solutions