我使用SWIG为C ++程序生成Perl模块。我在C ++代码中有一个函数,它返回一个“char指针”。现在我不知道如何在Perl中打印或获取返回的char指针。
示例C代码:
char* result() {
return "i want to get this in perl";
}
我想在Perl中调用此函数“result”并打印字符串。
怎么做?
此致 阿南丹
答案 0 :(得分: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 typemap。它非常简单,所以我不会在这里添加它,但您可以在上面链接的示例分发中找到它。
答案 1 :(得分:-1)
您必须参考www.swig.org/tutorial.html
上的SWIG教程
无论如何,因为你只想从perl调用函数C函数,
1.键入您的接口文件(在包装器和模块部分中包含所有函数声明)
2.使用swig和选项进行编译
3.使用gcc编译以创建对象
4.使用gcc选项编译以创建共享对象
5.按如下方式运行程序:
perl
use moduleName;
$a = moduleName::result();
[注意:查看生成的模块文件(.pm)以获取正确的funvtion原型,该原型指向包装文件中的正确函数。]