如何在编译时一贯地设置动态库的rpath路径?

3
我上周花了很多时间在Perl CommonMark模块上添加了全面的操作系统、Perl版本和cmark版本测试(pull request)。我大部分时间都花在了尝试让macOS和Windows能够在自定义位置找到每个版本的cmark构建和安装上。
在macOS上,设置INC=-"I/cmark-$version/include" LIBS=-"L/cmark-$version/lib -lcmark"就足以成功构建,但是对于某些Perl版本来说,在运行时无法找到cmark。通过查看this SO answer和其他一些资源,最终我通过在build script中添加了这一行代码,使其始终能够找到库文件。
[[ "${OSTYPE}" == "darwin"* ]] && install_name_tool -add_rpath "${PREFIX}/lib" blib/arch/auto/CommonMark/CommonMark.bundle || true

以这种方式添加rpath是有效的,尽管在某些情况下会失败,当rpath 已经存在时!因此使用|| true

我不确定为什么使用某些Perl/ExtUtils::MakeMaker版本构建时会添加rpath,而有些则不会。我尝试了各种方法来确保它每次都被添加,例如OTHERLDFLAGS=-Wl,-rpath,/cmark-$version/lib,但都没有成功。

在编译时,如何始终包含动态库的路径是正确的方法?理想情况下,应该有一种与操作系统无关的方法来实现。


但是对于某些版本的Perl来说,在运行时无法找到cmark。您能提供一个简单的示例来显示发生这种情况的Perl版本吗?然后我们可以尝试复现。 - undefined
@HåkonHægland 这个5.20版本构建可以编译,但在运行时无法找到库。同样的情况也出现在5.18版本,以及5.16版本,还有Windows上的5.32版本 - undefined
@HåkonHægland 你觉得安装最新的EU:MM会解决macOS上的问题吗?我需要设置LC_RPATHDYLD_LIBRARY_PATH(或将其中一个传递给Makefile.PL)吗? - undefined
@HåkonHægland 升级 EU::MM 确实修复了 macOS 上的问题,谢谢!现在是关于 Windows 的问题,就像这个 5.20 构建这个 5.32 构建中所示。 - undefined
还有这个5.38版本的Windows构建,它在编译时找不到库!链接 - undefined
显示剩余2条评论
1个回答

2

最终的答案是更新到最新的ExtUtils::MakeMaker版本。

正如@håkon-hægland在他对原帖的评论中指出的那样,他对此进行了相当多的调查,详细记录在ExtUtils-MakeMaker问题#402中。2021年9月合并的pull request是他解决这个问题的尝试;它在2021年12月的v7.64中发布。

升级到最新版本完全解决了这个问题,所以我能够删除对install_name_tool的调用。然而,任何在macOS 10.4或更早版本上进行测试的人需要使用v7.66来避免设置rpath


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接