Perl XSPP - множественное определение std :: string - PullRequest
3 голосов
/ 15 ноября 2011

Я пытаюсь раскрыть некоторые функции Google URL Library как модуль perl. Судя по некоторым сообщениям здесь и в других местах, похоже, что XSPP может быть хорошим местом для начала. Вот что я создал до сих пор (начиная с скомпилированной версии библиотеки googleurl):

Я создал этот файл xspp (некоторые методы для краткости опущены):

#include "gurl.h"
%typemap{std::string};
%typemap{bool};
%module{Google::URL};
class GURL
{
  %name{new} GURL(std::string& url);
  ~GURL();
  bool is_valid();
  bool is_empty();
  std::string spec();
  std::string possibly_invalid_spec();
  std::string scheme();
  std::string username();
  std::string password();
  std::string host();
  std::string port();
  std::string path();
  std::string query();
  std::string ref();
  bool has_scheme();
  bool has_username();
  bool has_password();
  bool has_host();
  bool has_port();
  bool has_path();
  bool has_query();
  bool has_ref();
};

И я создал этот файл Makefile.PL:

use 5.012;
use Module::Build::WithXSpp;
my $build = Module::Build::WithXSpp->new(
  module_name       => 'Google::URL::GURL',
  license           => 'perl',
  extra_typemap_modules => {
    'ExtUtils::Typemap::Default' => '0.01',
    'ExtUtils::Typemap::STL' => '0.01',
  },
  extra_linker_flags => '-L../googleurl -lgoogleurl',
  extra_compiler_flags => '-I. -I.. -I../googleurl -I../googleurl/base -I../googleurl/src',
);

Тогда я бегу:

perl Makefile.PL && ./Build

.. и получите следующую ошибку:

WARNING: the following files are missing in your kit:
    GURL.xs 
Please inform the author.

Created MYMETA.yml and MYMETA.json
Creating new 'Build' script for 'Google-URL-GURL' version '0.01' 
Building Google-URL-GURL
Processing XS typemap files...
Multiple definition of ctype 'std::string' in TYPEMAP section at ~/lib/perlbrew/perls/perl-5.14.2/lib/site_perl/5.14.2/ExtUtils/Typemaps.pm line 819.

Кто-нибудь с опытом работы с xspp знает, что может быть причиной этой ошибки? Я могу успешно запустить xspp для моего файла GURL.xsp, приведенного выше, и он выдаст вывод, который мне подходит.

1 Ответ

6 голосов
/ 15 ноября 2011

Документация ExtUtils :: Typemaps :: Default ясно говорит, что она уже включает ExtUtils :: Typemaps :: STL . Если вы удалите последнее из вашего extra_typemaps, все должно работать.

...