perl 如何在动态库和编译时一致地设置rpath?

oxf4rvwz  于 2023-10-24  发布在  Perl
关注(0)|答案(1)|浏览(159)

在过去的一周里,我花了大量的时间向Perl CommonMark模块(pull request)添加全面的OS、Perl Version和cmark版本测试。我的大部分时间都花在试图让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,但都无济于事。
在编译时总是包含动态库的路径的正确方法是什么?理想情况下,应该有一种与操作系统无关的方法来这样做。

trnvg8h3

trnvg8h31#

最终的答案是更新到最新的ExtUtils::MakeMaker。
正如@håkon-hægland在他对OP的评论中指出的那样,他对此进行了相当多的调查,如ExtUtils-MakeMaker issue #402中所记录的那样。2021年9月合并的pull request是他试图解决这个问题的尝试;它于2021年12月在v7.64中发布。
升级到最新版本完全修复了这个问题,所以我能够删除对install_name_tool的调用。然而,任何在macOS 10.4或更早版本上测试的人都需要v7.66来避免rpath的设置。

相关问题