【问题标题】:Makefile dependency when creating shared library links创建共享库链接时的 Makefile 依赖项
【发布时间】: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 选项改变了这一点)。 即使它们已经存在,总是会创建指向共享库的链接,这是什么意思?你怎么知道它们是被重建的?最后,如何构建共享库?您显示的任何规则都无法构建它。

标签: makefile shared-libraries


【解决方案1】:

您对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

$ cd ./adir/lib
$ ls -l
libmyshare.so.1 -> ./adir/lib/libmyshare.so.1.0.0
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)

MYSHAREL2 也是如此。 ln-r 选项创建相对于链接位置的符号链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2012-11-01
    • 2013-05-11
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多