我正在尝试使用pp(perl编译器)创建一个可以独立于perl安装的库和解释器运行的应用程序。
它成功地创建了一个已编译的可执行文件,尽管我必须使用 -x -c 选项才能让它成功找到依赖项。它将在我的机器上运行,但是当我在另一台机器上尝试时,我得到此错误,因此很明显仍然存在一些依赖性:
不支持 501 協議方案 'https' 不受支援(未安裝 LWP::P rotocol::https)
如果这有任何区别,我正在 MacOS 10.14.1 上运行它。谢谢!
LWP::P rotocol::https 是在需要时动态加载的,因此pp
无法知道默认情况下需要它。
解决方案 1
将-x
传递给pp
,并确保模块实际加载在运行中,pp
用于确定要包含的模块。这可能是通过使用 LWP 在该运行期间发出 HTTPS 请求来实现的。--xargs=...
可能对此有用。
解决方案 2
将-M LWP::Protocol::https
传递给pp
。您还可以传递-M 'LWP::Protocol::**'
以获取已安装的所有协议处理程序。
解决方案 3
将use LWP::Protocol::https ();
添加到脚本或包含的模块中。包括一条注释,说明您为什么要这样做是合适的。
您正在MacOS 10.14上构建Net::SSLeay
,将其链接到MacOS 10.12上不存在的libssl.44.dylib
,您尝试运行它。
我发现不得不在构建系统和测试系统之间切换以找出哪些库缺失或不兼容并需要打包,这很烦人。
我现在使用以下策略:
- 我使用perlbrew而不是system perl。
- 对于外星依赖,我使用自制软件而不是系统库。
- 我使用
pp
构建打包的可执行文件,并在设置export DYLD_PRINT_LIBRARIES=YES
的情况下运行生成的程序(在开发计算机上) - 我检查加载库的列表,并使用
pp -l /full/path/name -l ...
添加自制目录树(在我的情况下为/usr/local/opt/
和/usr/local/cellar/
)中引用的所有库 - 我重建可执行文件。
在部署之前,我仍然会检查目标计算机,但是现在它正常工作的可能性非常高。