【发布时间】:2018-06-01 15:52:31
【问题描述】:
在一个项目中,我已经创建了一个名为“myshare”的共享库。该库已创建为“libmyshare.so.1.0.0”,其位置相对于 makefile 的相对地址“adir/lib”。
在生成文件中,我想为名为“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 处理能够理解它。有谁知道我做错了什么?
【问题讨论】:
-
GNUMake 3.8.1 似乎无法将符号链接识别为现有文件。至于你为什么链接失败,你必须给我们一个可重现的例子。
-
默认情况下,GNU make 不考虑符号链接的修改时间。它考虑了它所指向的任何东西的修改时间(但
-L选项改变了这一点)。 即使它们已经存在,总是会创建指向共享库的链接,这是什么意思?你怎么知道它们是被重建的?最后,如何构建共享库?您显示的任何规则都无法构建它。