Swig Perl:错误的ELF类

时间:2018-07-17 13:33:46

标签: c++ perl swig elf

我正在尝试使用Swig从CXX模块中构建Perl模块。 有与此相关的多个指南:

  1. 带有Perl部分的通用Swig tutorial
  2. Swig and C++指南
  3. Swig and Perl5指南

我是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解释器的用户错误。

1 个答案:

答案 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来编译和链接命令)。