如何在makefile中添加相互依赖的库

Posted

技术标签:

【中文标题】如何在makefile中添加相互依赖的库【英文标题】:how to add interdependent libraries in a makefile 【发布时间】:2018-03-09 12:06:19 【问题描述】:

我需要为我的项目制作一个 makefile,并且我有两个相互依赖的库,它们是 libpcsc.so 和 libccid.so 。

谁能告诉我我的错误是什么?提前感谢您的回答。

如果您需要更多信息,请告诉我。

我的makefile是这样的:

顺便说一句,lib目录之一是/home/hasanbucak/Desktop/pcsc-lite-1.8.23/src/.libs/,另一个是usr/lib/pcsc/drivers/ifd-ccid.bundle/目录/Linux/

 CC = gcc

 LIB_DIRS = -L/home/hasanbucak/Desktop/pcsc-lite-1.8.23/src/.libs/ 
 -L../../usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/ 

 INCLUDE_DIR = /home/hasanbucak/Desktop/ccid-1.4.28/src/ #ccid_usb.h

 CFLAGS = -g -Wall

obj-y:= smcard

default: all


all: smcard

smcard: 
    $(CC) $(CFLAGS) $(LIB_DIRS)  -I$(INCLUDE_DIR) -c -o $(obj-y).o $(obj-y).c
    $(CC) $(CFLAGS) -lccid -lpcsclite  $(LIB_DIRS) -I$(INCLUDE_DIR) -o $(obj-y) $(obj-y).c  




clean:
    rm $(obj-y).o $(obj-y)

当我在终端中写 make 时,它​​说:

hasanbucak@ubuntu:~/Desktop/hasan$ make
gcc -g -Wall -L/home/hasanbucak/Desktop/pcsc-lite-1.8.23/src/.libs/ -L../../usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/   -I/home/hasanbucak/Desktop/ccid-1.4.28/src/ -c -o smcard.o smcard.c
gcc -g -Wall -lccid -lpcsclite  -L/home/hasanbucak/Desktop/pcsc-lite-1.8.23/src/.libs/ -L../../usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/  -I/home/hasanbucak/Desktop/ccid-1.4.28/src/ -o smcard smcard.c  
/usr/bin/ld: cannot find -lccid
collect2: error: ld returned 1 exit status
Makefile:20: recipe for target 'smcard' failed
make: *** [smcard] Error 1

【问题讨论】:

"谁能告诉我我的错误是什么?" 什么错误?你没有提到问题是什么。请edit您的问题并添加必要的信息。 您写道 ccid 在 usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/ 中,但您通过 ../../usr/lib/pcsc/ 引用它drivers/ifd-ccid.bundle/Contents 是不同的目录 找不到 lccid,在您的系统中找到这个 ccid 库,并确保在链接时提供正确的路径。 如果它们是相互依赖的,为什么不将它们合二为一呢? 非常感谢你们???? @beta 实际上我正在接受培训,我的导师希望我以这种方式做到这一点,但到目前为止我无法做到,但现在我明白了这个问题,感谢大家。 【参考方案1】:

Make 已经告诉你 Makefile 出了什么问题:

/usr/bin/ld: cannot find -lccid

您应该正确指定 ccid 的路径:

LIB_DIRS = -L/home/hasanbucak/Desktop/pcsc-lite-1.8.23/src/.libs/ 
  -L/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/

注意/usr../../usr 根本不是同一个目录。

第一个是绝对的(即相对于你的根目录),而第二个是相对的,它扩展为~/Desktop/hasan/../../usr,相当于/home/hasanbucak/usr

【讨论】:

以上是关于如何在makefile中添加相互依赖的库的主要内容,如果未能解决你的问题,请参考以下文章

如何影响目标的顺序,为 Makefile.am 添加额外的步骤等?

如何在makefile中指定头文件目录

makefile中依赖关系如何写?

如何在makefile中写入“或”内部依赖项?

CMake 的 FetchContent 与 Makefile 构建的依赖项

如何在makefile中指定头文件目录