我想从使用Perl的网站调用c ++函数。 c ++代码工作正常,我从SWIG包装器中遇到麻烦,关于c ++ 11中的一些新函数<串GT; STL。在这种情况下stoi(字符串),而问题是与其他函数相同,如string.pop_back(),stol ...所有函数带到<串GT;用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
界面在其他功能上正常工作(由于空间原因不显示)
感谢您的帮助
亚历
答案 0 :(得分: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和接口包装器的方法。