2014-09-09 2 views
0

에 내가 메이크 다음 한 작동하지 않습니다-L 및 -l 명령은 메이크

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 [email protected] 
    ar cq [email protected] $(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 

그것은이 프로젝트입니다 : 내가 make 명령을 실행하면 https://github.com/MihaiPro/Bank 이 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

오류 메시지 바로 앞에 오는 명령 줄은 무엇입니까? –

+0

makefile을 실행할 때 만들어집니다. 오류가 발생하기 전에 마지막 명령을 추가했습니다. –

답변

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라고

하지만 LDlibVirtualBank.a를 찾습니다.