我正在尝试使用Swig从CXX模块中构建Perl模块。 有与此相关的多个指南:
我是Swig的新手,对C(++)不太熟悉,但是我已经能够按照1中的教程编译模块:
我创建了一个接口文件:
%module my_module
%{
#include "case.h"
#include "case.h"
#include "lexindex.h"
#include "intlist.h"
#include "weight.h"
#include "invindex.h"
#include "winnow.h"
#include "nbayes.h"
#include "svmclass.h"
#include "svm.h"
#include "sockhelp.h"
#include "strtok_r.h"
extern int num_features_guess;
void StopServerFun( int Signal );
%}
extern int num_features_guess;
class Case {
public:
Case();
~Case();
};
class Feature {
public:
Feature();
~Feature();
};
我经营Swig:
swig -c++ -perl5 my_module.i
这将生成文件my_module_wrap.cxx
。
我编译:
g++ -c `perl -MConfig -e 'print join(" ", @Config{qw(ccflags optimize cccdlflags)}, "-I$Config{archlib}/CORE")'` my_module.cxx my_module_wrap.cxx
随后:
g++ `perl -MConfig -e 'print $Config{lddlflags}'` my_module.o my_module_wrap.o -o my_module.so
正如预期的那样,这确实创建了文件my_module.so
。
然后我尝试像这样使用它:
$ perl
use my_module;
这会导致以下错误:
无法为模块my_module加载'./my_module.so:./my_module.so:错误的ELF类:ELFCLASS64在/usr/net/ActivePerl-5.14.2.1402/lib/DynaLoader.pm第191行。 / p>
从错误消息中可以看到,我使用ActivePerl v5.14。 根据文档,Swig应该支持Perl版本> = 5.8。否则,我看不到要深入研究的地方。
有一个similar question about Python,但这是使用不同的Python解释器的用户错误。
答案 0 :(得分:1)
Can't load './my_module.so' for module my_module: ./my_module.so: wrong ELF class: ELFCLASS64
这意味着:您正在尝试将64位my_module.so
加载到32位perl
进程中。
您必须使用64位perl
,或将my_module.so
重建为32位共享库(通过添加-m32
来编译和链接命令)。