我有一个大约15,000行的Perl脚本,我希望用从C ++编译的Windows可执行文件中的PerlInterpreter
执行。
我尝试了these directions
我下载了Perl 5.18源代码并包含了perl.h
和EXTERN.h
以及core/win32
和core/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.h
和guidedef.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
答案 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::Embed与Utilities for embedding Perl in C/C++ applications
有关。
我自己没有尝试过,但我认为它可以提供帮助。一旦我有时间研究这个问题,我会再回过头来看看。
<强>更新强>:
具有嵌入式Perl解释器的应用程序列表:
ExtUtils::Embed
在configure.in
内使用(有关详细信息,请参阅git clone git://git.irssi.org/irssi
,或svn.irssi.org)ExtUtils::Embed
中使用configure.in
。有关详细信息hg clone https://vim.googlecode.com/hg/ vim
。Vim也allows scripting via Perl。)