如何通过Perlbrew编译生成libperl.so而非libperl.a?
问题描述
我正在将部分软件从RHEL 7迁移至Ubuntu 22.04,使用Perlbrew编译安装了带线程支持的Perl 5.36.0:
perlbrew install perl-5.36.0 --as=perl-5.36.0 -Duseithreads
但编译mod_perl时出现链接错误:
/usr/bin/ld: /perl5/perls/perl-5.36.0t/lib/5.36.0/x86_64-linux-thread-multi/CORE/libperl.a(op.o): relocation R_X86_64_PC32 against symbol `PL_hash_state_w' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: bad value
此前在RHEL 7中Perlbrew生成的是libperl.so,而Ubuntu中生成的是静态库libperl.a。请问如何设置Perlbrew安装选项,使其在Ubuntu中编译生成libperl.so?
解决方案
要让Perlbrew在Ubuntu 22.04中编译生成动态库libperl.so,需在安装参数中添加-Duseshrplib选项,该选项会强制Perl编译时生成共享版本的libperl。
修改后的安装命令如下:
perlbrew install perl-5.36.0 --as=perl-5.36.0 -Duseithreads -Duseshrplib
补充说明
-Duseshrplib是Perl编译配置的核心选项,专门用于生成动态链接库libperl.so,替代默认的静态库libperl.a。- 保留
-Duseithreads参数以维持线程支持,满足mod_perl对线程环境的依赖需求。 - 重新编译Perl完成后,再尝试编译mod_perl,即可解决上述链接错误。
内容的提问来源于stack exchange,提问作者ilgtech
相关产品推荐
相关产品推荐

