Bash ln命令创建断开的链接
我在makefile中使用ln命令时遇到问题 这是用于创建动态库的makefile的一部分: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).$(
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您已经走上了正轨。至少,您使用的是正确的:=我在