我使用SWIG为 C++ 程序生成 Perl 模块。我在 C++ 代码中有一个函数,它返回一个“char 指针”。现在我不知道如何在 Perl 中打印或获取返回的 char 指针。
示例 C 代码:
char* result() {
return "i want to get this in perl";
}
我想在 Perl 中调用这个函数“结果”并打印字符串。
怎么做?
问候, 阿南丹
根据 C++ 接口的复杂性,跳过 SWIG 并自己编写 XS 代码可能更容易、更快且更易于维护。XS&C++ 有点神秘。这就是为什么在 CPAN 上有 Mattia Barbon 的优秀ExtUtils::XSpp模块。它使包装 C++ 变得容易(而且几乎很有趣)。
ExtUtils::XSpp 发行版包括一个非常简单(并且是人为的)类的示例,该类具有一个字符串 (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 类型映射。这真的很简单,所以我不会在这里添加它,但是您可以在上面链接的示例分发中找到它。
您必须参考 www.swig.org/tutorial.html 上的 SWIG 教程
无论如何,因为您只想从 perl 调用 C 函数的函数,
1. 键入您的接口文件(在包装器中包含所有函数声明和模块部分)。
2. 使用 swig 和 options 编译。
3. 使用 gcc 编译以创建对象。
4. 使用 gcc 选项编译以创建共享对象。
5.运行程序如下:
perl
use moduleName;
$a = moduleName::result();
[注意:查看生成的模块文件(.pm)以获取正确的函数原型,该原型指向包装文件中的正确函数。]