2013-06-03 20 views
6

Mam 64-bitowy system CentOS 6 z niestandardową wersją Perla 5.12.5, który jest zbudowany dla 32-bitów. (Niestety, dlatego, że używamy tych samych RPM dla systemów 32-bitowych i 64-bitowych.)Jak zbudować 32-bitowe moduły XS dla 32-bitowego niestandardowego Perla w 64-bitowym systemie CentOS?

Kiedy buduję moduły XS (np. JSON :: XS) na serwerze, to się nie powiedzie, ponieważ buduje się 64- biblioteki bitowe. I pojawia się błąd jak

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. 

Próbowałem ustawienie zmiennej CFLAGS do "-m32-bit", ale to nie działa.

Co muszę zrobić, aby poprawnie skompilować moduły XS? Idealnie, chciałbym coś, co działa z cpanminus, ale może użyć cpan lub cpanplus w razie potrzeby.

+0

dziwne. Powinien używać dokładnie tych samych ustawień, które zostały użyte do zbudowania Perla. – ikegami

+0

@ikegami Perl został zbudowany na maszynie 32-bitowej, więc być może ustawienia nie musiały być wyraźne. – Rob

+0

Napraw uszkodzony złamany Perl (tj. Zainstaluj go prawidłowo), aby rozwiązać problem. – ikegami

Odpowiedz

2

System kompilacji Perla (w szczególności ExtUtils :: MakeMaker i ExtUtils :: CBuilder) zakłada platformę kompilacji, która została użyta do zbudowania tego perla, jest także użyteczną platformą uruchomieniową. Najwyraźniej tak nie jest.

Oczywistym rozwiązaniem jest skompilowanie perla z opcjami, które spowodowałyby te same pliki wykonywalne w obu narzędziach. To raczej trudne.

+0

Czy wiesz, jakie byłyby te opcje? – Rob

0

Okazuje się, że odpowiedź ta działa na mnie:

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