1. ホーム
  2. スクリプト・コラム
  3. パール

perl 操作 MongoDB エラー 未定義のシンボル。HeUTF8 解決策

2022-01-28 12:53:58

mongoのシェル操作はかなり面倒なので、perlを使ってmongoを操作してみましたが、perlはmongodbを操作するにはまず対応するドライバをインストールする必要があり、ほとんどの人はcpanを使ってインストールしますが、私はそれがあまりにも面倒だと思う、cpanmを使ってperlモジュールをインストールします。

コピーコード コードは以下の通りです。

# cpanm MongoDB
--> Working on MongoDB
Fetching http://www.cpan.org/authors/id/F/FR/FRIEDO/MongoDB-0.702.1.tar.gz ... OK
Configuring MongoDB-0.702.1 ... OK
Building and testing MongoDB-0.702.1 ... FAIL
Installing MongoDB failed. Installing MongoDB failed. See /root/.cpanm/work/1376540233.15152/build.log for details. Retry with --force to force install it.

cpanmは、-forceパラメータを使用して、エラーを報告しています。

コピーコード コードは以下の通りです。

# cpanm MongoDB --force
--> Working on MongoDB
Fetching http://www.cpan.org/authors/id/F/FR/FRIEDO/MongoDB-0.702.1.tar.gz ... OK
Configuring MongoDB-0.702.1 ... OK
Building and testing MongoDB-0.702.1 ... FAIL
Testing MongoDB-0.702.1 failed but installing it anyway. Testing MongoDB-0.702.1 failed but installing it anyway.
Successfully installed MongoDB-0.702.1 (upgraded from 0.702.0)
1 distribution installe

すべて正常に動作しているように見えますが テストスクリプト

スクリプトを読みます。

コピーコード コードは以下の通りです。

# cat /root/testMongo.pl
#! /usr/bin/perl
use MongoDB;
my $connection = MongoDB::Connection->new( host => 'localhost', port => 27017);

走ること

コピーコード コードは以下の通りです。

# perl /root/testMongo.pl
/usr/bin/perl: symbol lookup error: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/MongoDB/MongoDB.so: undefined symbol : HeUTF8

googleで "MongoDB.so: undefined symbol.を検索すると、「MongoDB.so:undefined symbol.undefined」と出てきます。HeUTF8"でググると関連記事が1つだけ見つかりました。あるグループがこの問題について議論しています。そのうちの一人が次のような解決策を提示しています。

コピーコード コードは以下の通りです。

# wget http://search.cpan.org/CPAN/authors/id/F/FR/FRIEDO/MongoDB-0.701.4.tar.gz
# tar -xzvf MongoDB-0.701.4.tar.gz
# cd MongoDB-0.701.4
Add the following to perl_mongo.h:
/* supply HeUTF8 if it's missing - ppport.h doesn't supply it, unfortunately */
 #ifndef HeUTF8
 #define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \
 SvUTF8(HeKEY_sv(he)) : \
 (U32)HeKUTF8(he))
 #endif
# perl Makefile.PL
# make
# make install

perlスクリプトは問題なく実行されます。

実は非互換性の問題で、mongodb用のperlドライバの最終バージョンはRHEL5/CENTOS5ディストリビューション用のv0.45なんです

以下は、海外のユーザーからの回答です。

Rhel5/CentOS5でコンパイル、テスト、インストールが正常に行える最新バージョンはKRISTINAさんのv0.45です。(Any::Mooseが必要です)
https://metacpan.org/release/KRISTINA/MongoDB-0.45