2009-09-07 52 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原型指向在包裝文件的正確功能]