如何在64位CentOS系统上为32位自定义Perl构建32位XS模块?

如何在64位CentOS系统上为32位自定义Perl构建32位XS模块?,perl,xs,makemaker,Perl,Xs,Makemaker,我有一个64位CentOS 6系统,运行一个定制的Perl 5.12.5版本,即32位版本。(唉,这是因为我们对32位和64位系统使用相同的RPM。) 当我在服务器上构建XS模块(例如JSON::XS)时,它会失败,因为它正在构建64位库。我得到一个错误,比如 Can't load '.cpanm/work/1370279501.28897/JSON-XS-2.33/blib/arch /auto/JSON/XS/XS.so' for module JSON::XS: .cpanm/work/1

我有一个64位CentOS 6系统,运行一个定制的Perl 5.12.5版本,即32位版本。(唉,这是因为我们对32位和64位系统使用相同的RPM。)

当我在服务器上构建XS模块(例如JSON::XS)时,它会失败,因为它正在构建64位库。我得到一个错误,比如

Can't load '.cpanm/work/1370279501.28897/JSON-XS-2.33/blib/arch
/auto/JSON/XS/XS.so' for module JSON::XS: .cpanm/work/137027950
1.28897/JSON-XS-2.33/blib/arch/auto/JSON/XS/XS.so: wrong ELF class: ELFCLASS64
at /opt/perl/lib/5.12.5/i686-linux/DynaLoader.pm line 200.
我尝试将CFLAGS变量设置为“-m32位”,但它不起作用

要正确编译XS模块,我需要做什么?理想情况下,我希望能够使用cpanminus,但如果需要,可以使用cpan或cpanplus。

Perl的构建系统(特别是ExtUtils::MakeMaker和ExtUtils::CBuilder)假定用于构建该Perl的编译平台也是可用的运行时平台。显然,这里的情况并非如此


显而易见的解决方案是使用选项编译perl,这些选项将在两个工具链上产生相同的可执行文件。这相当棘手。

事实证明,这个答案对我来说很有用:

wwalker $ PERL_MM_OPT='CCFLAGS="-m32 -march=i686" LDDLFLAGS="-m32 -march=i686"' /opt/depot/perl-5.8.5/bin/perl -MCPAN -e shell

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support enabled

cpan> install DBIx::Class

古怪的它应该使用与构建Perl完全相同的设置。@ikegami Perl是在32位机器上构建的,因此可能不需要显式设置。修复损坏的Perl(即正确安装)以解决问题。@ikegami您能更具体一点吗?它是如何安装不正确的?在路径中,PERL5LIB变量设置正确,本地lib变量设置正确。CPAN和CPANPLUS模块配置正确,在32位系统上运行良好。您说您在不同的机器上构建了它,但
perl
目前没有交叉编译器。您知道这些选项是什么吗?