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

问题描述 投票:0回答:1

上周我花费了大量时间向 Perl CommonMark 模块添加全面的操作系统、Perl 版本和 cmark 版本测试(拉取请求)。我的大部分时间都花在尝试让 macOS 和 Windows 找到在自定义位置构建和安装的每个 cmark 版本。

在 macOS 上,设置

INC=-"I/cmark-$version/include" LIBS=-"L/cmark-$version/lib -lcmark"
足以成功构建,但对于某些版本的 Perl,它无法在运行时找到 cmark。回顾这个SO答案和其他一些资源,我最终通过将这一行添加到构建脚本中来始终找到库:

[[ "${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 dll shared-libraries dylib cmark
1个回答
1
投票

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

正如 @håkon-hægland 在他对 OP 的评论中指出的那样,他对此进行了相当多的调查,如 ExtUtils-MakeMaker 问题 #402 中所述。 2021 年 9 月合并的“拉取请求”是他试图解决该问题的尝试;它于 2021 年 12 月在 v7.64 中发布。 升级到最新版本完全解决了该问题,但在 macOS 10.4 或更早版本上进行测试的任何人都需要 v7.66 以避免设置

rpath

    

© www.soinside.com 2019 - 2024. All rights reserved.