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

Posted

技术标签:

【中文标题】-L 和 -l 命令在 Makefile 中不起作用【英文标题】:-L and -l commands don't work in Makefile 【发布时间】:2014-09-09 17:06:16 【问题描述】:

我有以下 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

【问题讨论】:

VirtualBank 库吗?在哪里? 错误信息前的命令行是什么? 它是在你运行 makefile 时创建的。添加了错误前的最后一条命令。 这个命令:-L$(TOP) 告诉编译器在这里寻找库,对吧?和 -lVirtualBank 使用它,对吗? 您可以在gcc 命令行中看到-L../Bank/src 在那里。这就是 LDFLAGS 扩展的内容。我得出的结论是../Bank/src 中没有libVirtualBank.a(或.so)。看起来这是因为您将其命名为 VirtualBank.a。我建议使用名称libVirtualBank.a 【参考方案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

【讨论】:

以上是关于-L 和 -l 命令在 Makefile 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MacOS catalina Makefile 无法正确处理在 CLI 中工作的 shell 命令

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

NPM 脚本 - 配置变量和命令替换在 package.json 中不起作用

Informix“加载”命令在 Python pyodbc 中不起作用

使用系统命令将stdout和stderr输出重定向到文件在perl中不起作用[重复]

Aftertouch / Pressure Midi 命令在 AVFoundation 中不起作用