c++ - -L 和 -l 命令在 Makefile 中不起作用

标签 c++ c gcc makefile

我有以下 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 命令时,编译器没有找到 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

最佳答案

来自 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

关于c++ - -L 和 -l 命令在 Makefile 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25750282/

相关文章:

GCC 和链接环境变量和标志

c++ - Qt "The program has unexpectedly finished."关闭

c++ - 获取调用函数的类的名称

c - 为什么输入96时会出现段错误?

c - 简单的 PIPE 程序会读取奇怪的字符

c - 海湾合作委员会错误: expected ‘)’ before <function protoyprmeter> parameter

c++ - g++ 不生成任何文件或提供任何输出

c++ - 由于段错误,我的程序在 fflush 上崩溃,...但并非总是如此?

c++ - 用于找出隐式包含哪些文件的 Visual Studio 插件

gcc - 安装 vmware 工具 : location of GCC binary?