如何在Windows上的C ++应用程序中正确嵌入Perl解释器

时间:2014-04-25 01:06:09

标签: c++ perl visual-studio

我有一个大约15,000行的Perl脚本,我希望用从C ++编译的Windows可执行文件中的PerlInterpreter执行。

我尝试了these directions

我下载了Perl 5.18源代码并包含了perl.hEXTERN.h以及core/win32core/win32/include

的核心(安装)目录

然后我尝试在Visual Studio 2013中编译简单的C ++项目

#include <EXTERN.h>               /* from the Perl distribution     */
#include <perl.h>                 /* from the Perl distribution     */

static PerlInterpreter *my_perl;  /***    The Perl interpreter    ***/

int main(int argc, char **argv, char **env)
{
  PERL_SYS_INIT3(&argc,&argv,&env);
  my_perl = perl_alloc();
  perl_construct(my_perl);
  PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
  perl_parse(my_perl, NULL, argc, argv, (char **)NULL);
  perl_run(my_perl);
  perl_destruct(my_perl);
  perl_free(my_perl);
  PERL_SYS_TERM();
}

该项目没有编译,给出了数百个错误,但最常见的错误是

missing config.h file included by perl.h

所以我在#define PERL_MICRO

添加了perl.h语句

这将错误数量减少到20

但是,所有错误都源自Windows SDK文件string.hguidedef.h 所以我对这些错误的起源是什么一无所知

任何人都可以向我提供有关如何为Perl脚本创建和构建C ++解释器的任何信息吗?


剩下的错误是

Error   10  error C3861: 'my_memcmp': identifier not found  c:\program files (x86)\windows kits\8.1\include\shared\guiddef.h    161 1   

Error   3   error C2733: 'memmove_s' : second C linkage of overloaded function not allowed  c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 136 1   

Error   4   error C2733: 'memmove' : second C linkage of overloaded function not allowed    c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 139 1   

Error   2   error C2733: 'memcpy_s' : second C linkage of overloaded function not allowed   c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 57  1   

Error   1   error C2733: 'memcpy' : second C linkage of overloaded function not allowed c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 55  1   

Error   8   error C2732: linkage specification contradicts earlier specification for 'strstr'   c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 228 1   

Error   7   error C2732: linkage specification contradicts earlier specification for 'strrchr'  c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 226 1   

Error   6   error C2732: linkage specification contradicts earlier specification for 'strpbrk'  c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 224 1   

Error   5   error C2732: linkage specification contradicts earlier specification for 'strchr'   c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 222 1   

Error   9   error C2732: linkage specification contradicts earlier specification for 'memchr'   c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h 233 1   

1 个答案:

答案 0 :(得分:4)

我将描述一些我在这个问题上所知道的事情。我希望这会有所帮助。

首先,您应该指定在Windows上使用的Perl。 在Windows上我至少知道2个:

其次,您要实现的目标是Embedding a Perl interpreter in a C/C++ application。我提到这个,所以当你搜索关于它的文档时你可以参考它。

perlembed文档提供了有关此内容的一般信息。

如果您想在Windows上使用ActivePerl执行此操作,可以查看Embedding Perl Under WIN32

对于Strawberry Perl,someone on Perlmonks has a working example在Windows上嵌入Perl。

同时,请注意,遵循perlwin32 perl文档页面以便使用适当的路径设置MSVC编译器可能很有用。

最后,还有一本关于该主题的书名为Extending and Embedding Perl,您可能需要查看该主题的一些细节。在本书中,第8章讨论了在C中嵌入Perl,第9章讨论了嵌入案例研究。

<强>更新

阅读ExtUtils::MakeMaker文档我发现这部分看起来很有趣:

If you are running experiments with embedding perl as a library into other applications, you might find MakeMaker is not sufficient. You'd better have a look at ExtUtils::Embed which is a collection of utilities for embedding.

特别是ExtUtils::EmbedUtilities for embedding Perl in C/C++ applications有关。

我自己没有尝试过,但我认为它可以提供帮助。一旦我有时间研究这个问题,我会再回过头来看看。

<强>更新

具有嵌入式Perl解释器的应用程序列表: