我上周花了很多时间在Perl CommonMark模块上添加了全面的操作系统、Perl版本和cmark版本测试(pull request)。我大部分时间都花在了尝试让macOS和Windows能够在自定义位置找到每个版本的cmark构建和安装上。
在macOS上,设置
在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
,但都没有成功。
在编译时,如何始终包含动态库的路径是正确的方法?理想情况下,应该有一种与操作系统无关的方法来实现。
LC_RPATH
或DYLD_LIBRARY_PATH
(或将其中一个传递给Makefile.PL
)吗? - undefined