2009-09-07 54 views
1

我用SWIG为C++程序生成一个Perl模块。我在C++代码中有一个函数返回一个“字符指针”。现在我不知道如何在Perl中打印或获取返回的字符指针。如何在Perl中使用指向SWIG的字符的指针?

样品C代码:

char* result() { 
    return "i want to get this in perl"; 
} 

我想要调用在Perl这个功能 “结果”,并打印字符串。

如何做到这一点?

问候, 阿南丹

+0

你能提供示例代码吗? – tsee 2009-09-07 07:23:25

+0

为您的界面文件和您的cpp文件提供完整的代码。 – letsc 2011-06-08 08:21:52

回答

5

根据的C++接口的复杂性,可能会更容易,更快,更易于维护跳过SWIG和写入XS码自己。 XS & C++是一门神秘的艺术。这就是为什么Mattia Barbon在CPAN上出色的ExtUtils::XSpp模块。它使包装C++变得简单(并且几乎很有趣)。

ExtUtils :: XSpp发行版包含一个非常简单(并且人为设计)的example,该类有一个字符串(char *)和一个整数成员。以下是剪切界面文件的样子:

// This will be used to generate the XS MODULE line 
%module{Object::WithIntAndString}; 

// Associate a perl class with a C++ class 
%name{Object::WithIntAndString} class IntAndString 
{ 
    // can be called in Perl as Object::WithIntAndString->new(...); 
    IntAndString(); 

    // Object::WithIntAndString->newIntAndString(...); 
    // %name can be used to assign methods a different name in Perl 
    %name{newIntAndString} IntAndString(const char* str, int arg); 

    // standard DESTROY method 
    ~IntAndString(); 

    // Will be available from Perl given that the types appear in the typemap 
    int GetInt(); 
    const char* GetString(); 

    // SetValue is polymorphic. We want separate methods in Perl 
    %name{SetString} void SetValue(const char* arg = NULL); 
    %name{SetInt} void SetValue(int arg); 
}; 

请注意,这仍然需要有效的XS类型映射。这非常简单,所以我不会在这里添加它,但是您可以在上面链接的示例发行版中找到它。

+0

嗨..谢谢。但我想在swig中做到这一点.. – Anandan 2009-09-07 07:38:28

-1

您必须www.swig.org/tutorial.html都提到痛饮教程
不管怎么说,因为你只想调用该函数从Perl的C函数,
1.输入您的接口文件(其包装器和模块部分中的所有函数声明)。
2.编译swig和options。
3.使用gcc编译来创建对象。
4.编译gcc选项以创建共享对象。
5.运行该程序如下:

perl 
use moduleName; 
$a = moduleName::result(); 

[注:看到所生成的模块文件(的.pm)为正确funvtion原型指向在包装文件的正确功能]