Witam ponownie. Do programu z semaforami i pamięcią dzieloną (z wątku o bad address) postanowiłem napisać nowy plik makefile, tym razem z dwiema opcjami kompilacji: biblioteka statyczna oraz biblioteka dzielona. Swój makefile wzorowałem na pliku (działającym) znalezionym w internecie. Niestety, make zwraca następujące błędy:
dla biblioteki statycznej:
ar rv libFunctions.a sem_func.o mem_func.o
ar: tworzenie libFunctions.a
a - sem_func.o
a - mem_func.o
mkdir -p ./libs
mv libFunctions.a ./libs
gcc -o mains.x -Wall -O sem_func.o mem_func.o -L./libs -lFunctions
/usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o: In function_start': (.text+0x20): undefined reference to
main'
collect2: error: ld returned 1 exit status
makefile recipe for target 'mains.x' failed
make: *** [mains.x] Error 1
a dla biblioteki dynamicznej:
gcc -shared -o libFunctions.so -Wall -O sem_func.h mem_func.h
mkdir -p ./libs
mv libFunctions.so ./libs
gcc -o maind.x -Wall -O sem_func.o mem_func.o -L./libs -lFunctions
./libs/libFunctions.so: file not recognized: Nieznany format pliku
collect2: error: ld returned 1 exit status
makefile recipe for target 'maind.x' failed
make: *** [maind.x] Error 1
Kompletnie nie wiem, co robię źle. Szukałem odpowiedzi w internecie, lecz nie znalazłem innego sposobu podobnego do użytego przeze mnie.
Proszę o pomoc, być może coś zostało przeze mnie źle zrozumiane.
Makefile:
CC=gcc
CFLAGS=-Wall -O -fPIC
LFLAGS=-Wall -O
LIBS=sem_func.h mem_func.h
EXTRAS= sem_func.o mem_func.o
NAME1=producer
NAME2=consumer
NAME3=main
DIR=`basename $(PWD)`
%.o: %.c %.h
$(CC) -c $(CFLAGS) $<
%.o: %.c
$(CC) -c $(CFLAGS) $<
#biblioteka statyczna
EX1s=$(NAME1)s.x
EX2s=$(NAME2)s.x
EX3s=$(NAME3)s.x
EX1d=$(NAME1)d.x
EX2d=$(NAME2)d.x
EX3d=$(NAME3)d.x
LIB_NAME=Functions
LIB_DIR=./libs
#biblioteka statyczna
LIB_STAT=lib$(LIB_NAME).a
#biblioteka dynamiczna
LIB_SHARED=lib$(LIB_NAME).so
AR=ar
ARFLG=rv
$(EXTRAS): $(LIBS)
$(LIB_STAT): $(EXTRAS)
$(AR) $(ARFLG) $@ $?
mkdir -p $(LIB_DIR)
mv $(LIB_STAT) $(LIB_DIR)
$(LIB_SHARED): $(EXTRAS)
$(CC) -shared -o $@ $(LFLAGS) $(LIBS)
mkdir -p $(LIB_DIR)
mv $(LIB_SHARED) $(LIB_DIR)
#wersja z biblioteką statyczną
$(EX1s): $(NAME1).o $(EXTRAS) $(LIB_STAT)
$(CC) -o $@ $(LFLAGS) $(EXTRAS) -L$(LIB_DIR) -l$(LIB_NAME)
$(EX2s): $(NAME2).o $(EXTRAS) $(LIB_STAT)
$(CC) -o $@ $(LFLAGS) $(EXTRAS) -L$(LIB_DIR) -l$(LIB_NAME)
$(EX3s): $(NAME3).o $(EXTRAS) $(LIB_STAT)
$(CC) -o $@ $(LFLAGS) $(EXTRAS) -L$(LIB_DIR) -l$(LIB_NAME)
run1: $(EX3s) $(EX1s) $(EX2s)
./$(EX3s) $(EX1s) $(EX2s) $(in) $(out)
make check
make clean
make diff
#wersja z biblioteką dynamiczną
$(EX1d): $(NAME1).o $(EXTRAS) $(LIB_SHARED)
$(CC) -o $@ $(LFLAGS) $(EXTRAS) -L$(LIB_DIR) -l$(LIB_NAME) -Wl,-R $(LIB_DIR)
$(EX2d): $(NAME2).o $(EXTRAS) $(LIB_SHARED)
$(CC) -o $@ $(LFLAGS) $(EXTRAS) -L$(LIB_DIR) -l$(LIB_NAME) -Wl,-R $(LIB_DIR)
$(EX3d): $(NAME3).o $(EXTRAS) $(LIB_SHARED)
$(CC) -o $@ $(LFLAGS) $(EXTRAS) -L$(LIB_DIR) -l$(LIB_NAME) -Wl,-R $(LIB_DIR)
run2: $(EX3d) $(EX1d) $(EX2d)
./$(EX3d) $(EX1d) $(EX2d) $(in) $(out)
make check
make clean
make diff
clean:
rm -f *.x *.o
check:
ipcs -s
ipcs -m
sdel:
ipcrm -S $(key)
mdel:
ipcrm -m $(id)
diff:
diff -s $(in) $(out)