我需要生成一个perl模块Vinod :: StatHandler。我有2个与c ++代码相关的文件。(statHandler.h,statHandler.cpp)
目前,我正在使用以下命令来生成模块。
swig -perl -noproxy -c++ -o StatHandler_wrap.cxx StatHandler.i
它生成了模块StatHandler.pm
我使用以下命令生成了.so文件。
g++ -c statHandler.h statHandler.cpp -fPIC
g++ -O2 -shared -o StatHandler.so statHandler.o
通过仅包含“ use StatHandler;”,我得到了以下错误:在测试的Perl脚本中。
Can't find 'boot_StatHandler' symbol in /home/vinod/cpp/swig//StatHandler.so
LD_LIBRARY_PATH设置正确。我试图浏览SWIG文档,但从中学不到很多。
我应该在StatHandler.i文件中指定什么以生成包“ Vinod :: StatHandler”。
我需要为swig提供其他选择吗?
StatHandler.i的内容:
%module "Vinod::StatHandler"
%{
#include "statHandler.h"
%}
#ifdef STATIC
%include perlmain.i
#endif
class StatHandler {
StatHandler(string _dirName, string _statsFile):_statsDir(_dirName),_finalStatsFile(_statsFile){};
void printStats();
};
statHandler.h的内容:
#ifndef STATHANDLER_H_
#define STATHANDLER_H_
#include<iostream>
#include<string.h>
#include<map>
#include<vector>
using namespace std;
class StatHandler {
private:
string _statsDir;
string _finalStatsFile;
vector<string> _statFiles;
map <string, int> _dailyStats;
public:
StatHandler(string _dirName, string _statsFile):_statsDir(_dirName),_finalStatsFile(_statsFile){};
bool getAllStatFiles();
void extractStats();
void printStats();
};
#endif
StatHandlers.cpp的内容:
#include <iostream>
#include "statHandler.h"
#include <sys/types.h>
#include <dirent.h>
#include <fstream>
#include <cstdlib>
using namespace std;
bool StatHandler::getAllStatFiles() {
DIR* dirHandler;
struct dirent* statsFile;
if(dirHandler=opendir(_statsDir.c_str())){
while(statsFile = readdir(dirHandler)){
size_t size=strlen(statsFile->d_name);
if(size>3) {
char extension[4];
memcpy(extension, &(statsFile->d_name[size-3]), 3);
extension[3]='\0';
if(strcmp(extension,".st") == 0) {
_statFiles.push_back(_statsDir+statsFile->d_name);
}
}
}
} else {
return false;
}
return true;
}
void StatHandler::extractStats() {
getAllStatFiles();
for(vector<string>::iterator fileIter=_statFiles.begin();fileIter!=_statFiles.end();++fileIter) {
cout<<*(fileIter)<<"\n";
ifstream in;
in.open(fileIter->c_str(), ios::in);
string term;
while( in.is_open() && !getline(in, term, '\n').eof() ){
size_t pos=0;
if( (pos=term.find(" ")) != string::npos) {
string keyword = term.substr(0,pos);
string countStr=term.substr(pos+1);
int count = atoi(countStr.c_str());
if(_dailyStats.find(keyword) != _dailyStats.end()) {
_dailyStats[keyword]+=count;
} else {
_dailyStats[keyword]=count;
}
}
term.clear();
}
in.close();
}
}
void StatHandler::printStats() {
ofstream out;
out.open(_finalStatsFile.c_str(), ios::out);
if(out) {
for(map<string, int>::iterator statIter=_dailyStats.begin(); statIter!=_dailyStats.end();++statIter) {
out<<statIter->first<<"\t"<<statIter->second<<"\n";
}
out.close();
}
}
int main(int argc, char** argv) {
StatHandler sh("/home/vinod/cpp/swig/","/home/vinod/cpp/swig/finalStats");
sh.extractStats();
sh.printStats();
return 0;
}
最佳答案
实际上,您忘记了编译swig
生成的包装器。
如SWIG Doc中所述,您需要:
swig -perl -noproxy -c++ -o StatHandler_wrap.cxx StatHandler.i
g++ -c StatHandler.cpp -fPIC
g++ -c StatHandler_wrap.cxx -I /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE -fPIC
g++ -O2 -shared -o StatHandler.so StatHandler.o StatHandler_wrap.o
然后,只要将整个内容放在
Vinod/
子目录中,LD_LIBRARY_PATH="Vinod" perl -MVinod::StatHandler
将按预期工作。注意:我在您的各种文件中编辑了案件和复数形式,因为它们不一致。