Как добавить все зависимости модуля Perl DBI в архив упаковщика PAR

Я создал скрипт Perl, который использует пакет DBI для подключения к базе данных MySQL. Чтобы запустить его на других платформах Linux, где не обязательно установлены все зависимости, я создаю отдельный автономный файл, который включает все зависимости с помощью Par Packer (pp), с помощью следующей команды:

pp -c -x -o myscript myscript.pl

Автономный файл отлично работает на компьютере, на котором он был создан, однако на других машинах я получаю следующую ошибку в строке, где выполняется DBI -> connect().

install_driver(mysql) failed: Can't load '/tmp/par-6d756e7a/cache-44c3853ef3002ad860cfe135d24ccc8829af39da/89fc0e43.so' for module DBD::mysql: libmysqlclient.so.20: cannot open shared object file: No such file or directory at /usr/lib/x86_64-linux-gnu/perl/5.22/DynaLoader.pm line 187.
 at /usr/local/share/perl/5.22.1/PAR/Heavy.pm line 123.
Compilation failed in require at (eval 15) line 3.
Perhaps a required shared library or dll isn't installed where expected
 at DBI/DBHandler.pm line 41.

Кажется, что файл отсутствует, но я не знаю, как это исправить. Добавление -lib=/tmp/par-6d756e7a/cache-44c3853ef3002ad860cfe135d24ccc8829af39da/89fc0e43.so не работает

Обновление 1

Следующие библиотеки уже установлены на сервере, где происходит ошибка:

$ dpkg -l | grep mysql
ii  libdbd-mysql-perl                    4.028-2+deb8u2               amd64        Perl5 database interface to the MySQL database
ii  libmysqlclient18:amd64               5.5.54-0+deb8u1              amd64        MySQL database client library
ii  mysql-client                         5.5.54-0+deb8u1              all          MySQL database client (metapackage depending on the latest version)
ii  mysql-client-5.5                     5.5.54-0+deb8u1              amd64        MySQL database client binaries
ii  mysql-common                         5.5.54-0+deb8u1              all          MySQL database common files, e.g. /etc/mysql/my.cnf

Вот пример сценария:

#!/usr/bin/perl

use DBI;

my $dbh = DBI -> connect("dbi:mysql:homo_sapiens_core_89_38:ensembldb.ensembl.org:3306", "anonymous") || die "Connection Error: $DBI::errstr\n"; 

my $sth = $dbh -> prepare("SELECT * FROM exon limit 10");
my $success = $sth -> execute();

if (!$success && !defined $DBI::errstr){
    print STDERR "Query not successful. No error message returned. Try to continue.\n";
}
elsif (!$success && defined $DBI::errstr){
    die "SQL Error: $DBI::errstr\n";
}

while (my @row = $sth -> fetchrow_array){
    print join("\t", @row)."\n";
}

$sth  -> finish();

$dbh -> disconnect();

1 ответ

Решение

Следующая часть сообщения об ошибке:

libmysqlclient.so.20: cannot open shared object file: No such file or directory

... обычно означает, что клиентская библиотека MySQL не установлена ​​в системе, которую вы пытаетесь распаковать / установить, поэтому вам необходимо установить ее. Например, в Ubuntu:

sudo apt-get install mysql-client
Другие вопросы по тегам