创建共享库链接时的Makefile依赖项

创建共享库链接时的Makefile依赖项,makefile,shared-libraries,Makefile,Shared Libraries,在一个项目中,我已经创建了一个名为“myshare”的共享库。该库已创建为“libmyshare.so.1.0.0”,其位置相对于makefile,相对地址为“adir/lib” 在makefile中,我想为共享库创建名为“libmyshare.so.1”和“libmyshare.so”的符号链接。为了在makefile中执行此操作,我有以下几行代码: MYSHAREL = ./adir/lib/libmyshare.so.1.0.0 MYSHAREL1 = ./adir/lib/libmysh

在一个项目中,我已经创建了一个名为“myshare”的共享库。该库已创建为“libmyshare.so.1.0.0”,其位置相对于makefile,相对地址为“adir/lib”

在makefile中,我想为共享库创建名为“libmyshare.so.1”和“libmyshare.so”的符号链接。为了在makefile中执行此操作,我有以下几行代码:

MYSHAREL = ./adir/lib/libmyshare.so.1.0.0
MYSHAREL1 = ./adir/lib/libmyshare.so.1
MYSHAREL2 = ./adir/lib/libmyshare.so
MYSHARELIBS = $(MYSHAREL) $(MYSHAREL1) $(MYSHAREL2)

.PHONY: all
all: myexetarget

myexetarget : various_files $(MYSHARELIBS)
    various_commands_to_make_target

$(MYSHAREL1): $(MYSHAREL)
    @echo "Creating symbolic link $(MYSHAREL1)"
    @ln -s $(MYSHAREL) $(MYSHAREL1)

$(MYSHAREL2): $(MYSHAREL)
    @echo "Creating symbolic link $(MYSHAREL2)"
    @ln -s $(MYSHAREL) $(MYSHAREL2)
当我运行“make”命令时,始终会创建指向共享库的链接,即使它们已经存在,即使共享库的日期早于已创建符号链接的日期。此外,当我尝试实际链接到目标中的共享库时,尽管上面未显示链接器选项中有-L./adir/lib和-lmyshare选项,但链接失败:

/usr/bin/ld: cannot find -lmyshare
这两个问题都使我相信,我没有正确地指定共享库的名称或相对位置,使makefile处理能够理解它。有人知道我做错了什么吗?

您使用ln-s可能是您出现问题的原因。如果从您的顶级目录执行:

ln -s ./adir/lib/libmyshare.so.1.0.0 ./adir/lib/libmyshare.so.1
这就是make规则所做的,在./adir/lib中创建了一个符号链接,名为libmyshare.so.1,指向./adir/lib/libmyshare.so.1.0.0:

因此,./adir/lib/libmyshare.So.1实际上指向不存在的。/adir/lib/adir/lib/libmyshare.So.1.0.0

您可以通过以下方式替换ln-s命令:

@ln -sr $(MYSHAREL) $(MYSHAREL1)

我的丈夫也一样。ln的-r选项创建相对于链接位置的符号链接。

GNUMake 3.8.1似乎无法将符号链接识别为现有文件。至于为什么链接失败,你必须给我们一个可重复的例子。默认情况下,GNU make不考虑符号链接的修改时间。它考虑它指向的任何对象的修改时间,但是-L选项改变了这一点。即使共享库的链接已经存在,也会始终创建它们,这是什么意思?您如何知道它们是重新创建的?最后,您如何构建共享库?您显示的任何规则都不能构建它。
@ln -sr $(MYSHAREL) $(MYSHAREL1)