Команды -L и -l не работают в Makefile

0

У меня есть следующий Makefile:

TOP = ../Bank/src
CC = gcc

CFLAGS = -g -Wall -std=c99
LDFLAGS = -L$(TOP)
LFLAGS = -lVirtualBank
INCLUDES = -I$(TOP)/VirtualBank/ 
LIBS = VirtualBank.a

BANK_SOURCES = $(TOP)/bank.c 
VirtualBank_SOURCES = $(TOP)/VirtualBank/bankServer.c $(TOP)/VirtualBank/dataBase.c $(TOP)/VirtualBank/account.c

BANK_OBJECTS = $(BANK_SOURCES:.c=.o)
VirtualBank_OBJECTS = $(VirtualBank_SOURCES:.c=.o)
TARGET = bank

all: VirtualBank.a $(TARGET)

VirtualBank.a:$(VirtualBank_OBJECTS)
    rm -f $@
    ar cq $@ $(VirtualBank_OBJECTS)
    mv *.a $(TOP)/

$(VirtualBank_OBJECTS):$(VirtualBank_SOURCES)
    $(CC) -c $(CFLAGS) $(INCLUDES) $(VirtualBank_SOURCES)
    mv *.o $(TOP)/VirtualBank/

$(TARGET):$(BANK_OBJECTS) 
    $(CC) $(CFLAGS) $(INCLUDES) $(BANK_OBJECTS) -o $(TARGET) $(LDFLAGS) $(LFLAGS)
    chmod +x $(TARGET)

$(BANK_OBJECTS):$(BANK_SOURCES)
    $(CC) $(CFLAGS) -c $(INCLUDES) $(BANK_SOURCES)
    mv *.o $(TOP)/


clean: 
    cd ../Bank
    rm -rf *.o bank
    cd $(TOP)
    rm -rf *.o *.a
    cd $(TOP)/VirtualBank
    rm -rf *.o

Именно из этого проекта: https://github.com/MihaiPro/Bank Когда я запускаю команду make, commpiler не находит библиотеку VirtualBank. Я думаю, что проблема заключается в команде -l, я снова прочитал об этой команде, но я не знаю, что является проблемой.

Вы можете мне помочь?

Благодарю!

РЕДАКТИРОВАТЬ

Сообщение об ошибке:

gcc -g -Wall -std=c99 -I../Bank/src/VirtualBank/  ../Bank/src/bank.o -o bank -L../Bank/src -lVirtualBank
/usr/bin/ld: cannot find -lVirtualBank
collect2: error: ld returned 1 exit status
make: *** [bank] Error 1
  • 2
    У вас есть библиотека VirtualBank? Где?
  • 0
    Что такое командная строка непосредственно перед сообщением об ошибке?
Показать ещё 7 комментариев
Теги:
makefile
gcc

1 ответ

6
Лучший ответ

Из ld (1):

-l namespec
--library=namespec
Add the archive or object file specified by namespec to the list of files to link. This option may be used any number of times. If namespec is of the form :filename, ld will search the library path for a file called filename, otherwise it will search the library path for a file called libnamespec.a.
On systems which support shared libraries, ld may also search for files other than libnamespec.a. Specifically, on ELF and SunOS systems, ld will search a directory for a library called libnamespec.so before searching for one called libnamespec.a. (By convention, a ".so" extension indicates a shared library.) Note that this behavior does not apply to :filename, which always specifies a file called filename.

The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again.

See the -( option for a way to force the linker to search archives multiple times.

You may list the same archive multiple times on the command line.

This type of archive searching is standard for Unix linkers. However, if you are using ld on AIX , note that it is different from the behaviour of the AIX linker.

Ваша библиотека называется VirtualBank.a, но ld будет искать libVirtualBank.a.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню