Bash ln命令创建断开的链接

Bash ln命令创建断开的链接,bash,makefile,dynamic-linking,Bash,Makefile,Dynamic Linking,我在makefile中使用ln命令时遇到问题 这是用于创建动态库的makefile的一部分: NAME := Net DDIR := dynamic_library DLIB := $(DDIR)/lib$(NAME).so MAJOR := 1 MINOR := 0 VERSION := $(MAJOR).$(MINOR) $(DLIB).$(VERSION): $(OBJD) g++ -shared -Wl,-soname,$(DLIB).$(

我在makefile中使用ln命令时遇到问题

这是用于创建动态库的makefile的一部分:

NAME := Net    
DDIR := dynamic_library    
DLIB := $(DDIR)/lib$(NAME).so    
MAJOR := 1    
MINOR := 0    
VERSION := $(MAJOR).$(MINOR)
$(DLIB).$(VERSION): $(OBJD)
    g++ -shared -Wl,-soname,$(DLIB).$(MAJOR) $^ -o $@
$(DLIB): $(DLIB).$(VERSION)
    ln -sf $(DLIB).$(VERSION) $(DLIB)
    ln -sf $(DLIB).$(VERSION) $(DLIB).$(MAJOR)
OBJD
是我的.o文件

我正在尝试在dynamic_library/中的libNet.so.1.0旁边创建链接

ln命令创建目标地址不完整但目标正确的断开链接

我尝试在源代码之前添加
/
/
,但它们不起作用

任何帮助都将不胜感激

编辑 通过反复试验找到了答案

显然,我们应该在源代码之前添加
。/
。我不知道为什么

如果有人有更好的方法,请回答

g++ -shared -Wl,-soname,$(DLIB).$(MAJOR) $^ -o $@

它不是应该是
-Wl,-soname,$(DLIB)。$(VERSION)

ln-s
在目标位置创建一个链接,链接目标是源路径(而不是您给出ln命令的完整路径)。如果您的链接目标是源目录下的目录,并且您没有使用到源目录的完整路径,那么您需要
。/
,以便链接目标是
。/source.file
,而不是
source.file
,因为这将使链接指向同一目录中的文件

比较:

$ ln -s bar foo
$ readlink foo
bar
$ readlink -f foo
/tmp/bar
$ ln -s ../bar foo
$ readlink foo
../bar
$ readlink -f foo
/foo
$ ln -s /tmp/bar foo
$ readlink foo
/tmp/bar
$ readlink -f foo
/tmp/bar

ln
命令的一些变体包括:

ln -s abs_path_to_link_target rel_path_from_current_dir_to_link_source
ln -s rel_path_from_link_src_to_target rel_path_from_current_dir_to_link_source
但您尝试使用的以下内容不是其中之一:

ln -s rel_path_from_current_dir_to_link_target ...
您的makefile还有另一个微妙的错误,即链接源不依赖于对链接目标的更改,它只依赖于链接目标的存在

另一个问题是,当您设定
$(DLIB)
目标时,会产生“副作用”。我猜你是一个软件工程师,所以你知道副作用对并行性有害,导致竞争条件,并使代码难以阅读

此外,应该始终使用自动变量,例如
$@
,并依赖于Makefile

最后,我希望您知道为什么要使用
-f
。上面的一些回复,包括我的:),没有使用它。这在Makefile上下文中非常重要,不要放弃它

记住这些要点,最干净、最正确的方法是:

$(DLIB) $(DLIB).$(MAJOR): Makefile | $(DLIB).$(VERSION)
    ln -sf $(abspath $|) $@

不,现在我在源代码之前添加了../就可以了。谢谢。它可能对你“有用”,但如果你将目录重命名为“动态库”以外的其他名称,它就行不通了。哇,谢谢。这是我第一次尝试制作一个合适的makefile,我仍在努力掌握基本知识,因为我真的不知道我在做什么。@user3048908您已经走上了正轨。至少,您使用的是正确的:=我在