Как создать 32-разрядные модули XS для 32-разрядного пользовательского Perl в 64-разрядной системе CentOS?
У меня есть 64-битная система CentOS 6, работающая под заказной версией Perl 5.12.5, то есть для 32-битной сборки. (Увы, это потому, что мы используем одинаковые RPM для 32-разрядных и 64-разрядных систем.)
Когда я собираю 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-bit", но она не работает.
Что мне нужно сделать, чтобы правильно скомпилировать модули XS? В идеале я хотел бы что-то, что работает с cpanminus, но может использовать cpan или cpanplus, если это необходимо.
2 ответа
Система сборки 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