swig c ++ to perl: как использовать c ++ 11 строковые функции STL

0

Я хотел бы назвать функции c++ с веб-сайта, который использует Perl. Код c++ работает отлично, я получаю неприятности от оболочки SWIG относительно некоторой новой функции из c++ 11 в <string> STL. в этом случае stoi (string), в то время как проблема одинаков с другими функциями, такими как string.pop_back(), stol... все функции, переданные в <string> с c++ 11 vesrsion.

как заставить SWIG учитывать эти новые функции, чтобы они могли скомпилировать?

Вот сообщение об ошибке, я получил ошибку: 'stoi не является членом' std

/* --- source fonctions.cpp --- */
bool checkRIB(std::string word){
    cout << "verification du rib : "<< word<<endl;
    if (word.size()!=23) return false;
    for (size_t i=0; i!=word.size(); i++) {
        if (!isdigit(word[i])){
            if ((word[i]>='A'&&word[i]<='I')){
                word[i]= (int)(word[i]-'A')%10+'1';
            }else if ((word[i]>='J'&&word[i]<='R')){
                word[i]= (int)(word[i]-'J')%10+'1';
            } else if ((word[i]>='S'&&word[i]<='Z')){
                word[i]= (int)(word[i]-'S')%10+'2';
            } else cout << "mauvais code"<<endl;
        }
    }   
    return ( (97-((89*std::stoi(word.substr(0,5)) + 15*std::stoi(word.substr(5,5))+3*std::stol(word.substr(10,11))) % 97)) == std::stoi(word.substr(21,2)) );
}

/* --- header fonctions.h--- */
#ifndef DEF_FONCTIONS
#define DEF_FONCTIONS

#include <fstream>      // pour lecture / ecriture de fichiers
#include <iostream>
#include <math.h>
bool checkRIB(std::string word);
#endif

/* --- interface code interface.i --- */
%module interface
%include"std_string.i"
%include "std_map.i"
%include "std_vector.i"
%{ 
/* Put header files here or function declarations like below */
    bool checkRIB(std::string word);
}
bool seRessemblent(const std::string &s1, const std::string & s2, float seuil=0.65);

%}
bool checkRIB(std::string word);

и глупые шаги для компиляции (на Ubuntu):

1% swig -c++ -perl5 interface.i
2% g++ -c 'perl -MConfig -e 'print join(" ", @Config{qw(ccflags optimize cccdlflags)}, "-I$Config{archlib}/CORE")'' fonctions.cpp interface_wrap.cxx
(here error : *error: ‘stoi is not a member of ‘std*)
3% g++ 'perl -MConfig -e 'print $Config{lddlflags}'' fonctions.o interface_wrap.o -o interface.so

Интерфейс отлично работает с другими функциями (не отображается для разума)

Спасибо за помощь

Alexis

  • 1
    Вам нужно передать -std=c++11 в gcc. У swig должен быть способ передать дополнительные флаги компилятора.
Теги:
c++11
swig
stl

1 ответ

0
Лучший ответ

Я нашел способ решить проблему: я разделил процедуру компиляции с

1% swig -c++ -perl5 interface.i
2% g++ -c 'perl -MConfig -e 'print join(" ", @Config{qw(ccflags optimize cccdlflags)}, "-I$Config{archlib}/CORE")'' fonctions.cpp interface_wrap.cxx
(here error : *error: ‘stoi is not a member of ‘std*)
3% g++ 'perl -MConfig -e 'print $Config{lddlflags}'' fonctions.o interface_wrap.o -o interface.so

в

1% swig -c++ -perl5 interface.i
2% g++ -c -fPIC fonctions.cpp -std=c++11
3% g++ -c 'perl -MConfig -e 'print join(" ", @Config{qw(ccflags optimize cccdlflags)}, "-I$Config{archlib}/CORE")'' interface_wrap.cxx
4% g++ 'perl -MConfig -e 'print $Config{lddlflags}'' fonctions.o interface_wrap.o -o interface.so

Таким образом, обычный c++ код компилируется в c++ 11 по мере необходимости. используется опция -fPIC, чтобы библиотеки могли быть соединены.

Однако я не мог найти способ использовать c++ 11 с оболочкой интерфейса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню