繁体   English   中英

C ++中的Python:未解决的外部

[英]Python in C++: Unresolved external

我尝试将Python嵌入我的C ++应用程序中,但链接器一直在说此错误:

[ILINK32 Error] Error: Unresolved external '_PyModule_Create2TraceRefs' referenced from E:\CPP PROJECTS\ANDERLICHT\WIN32\DEBUG\ANDERLICHT.OBJ

我使用的是Embarcadero C ++ Builder XE2,所以我将coff2omf.exe转换成了python33.lib。

这是我在main.cpp中的代码:

#include "anderlicht.c"
#pragma comment(lib, "python33_omf.lib")

// In main():
PyImport_AppendInittab("anderlicht",PyInit_anderlicht);
Py_SetProgramName(programName.w_str());
Py_Initialize();

anderlicht.c中包含Python.h。 我该怎么做才能解决此错误?

我遇到了同样的问题,但是我找到了不需要重建的解决方案。

如果要开发新的应用程序,则处于调试模式:编译器定义_DEBUG。 在文件“ pyconfig.h”(Python 3.6.3的第336行附近)中,您可以找到:

#ifdef _DEBUG
#define Py_DEBUG
#endif

=> 删除此代码。

如果您保留该代码,则您处于Py_Debug模式,因此在object.h中将触发此操作:

#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
#define Py_TRACE_REFS
#endif

在modsupport.h中定义了以下别名:

#ifdef Py_TRACE_REFS
 /* When we are tracing reference counts, rename module creation functions so
    modules compiled with incompatible settings will generate a
    link-time error. */
 #define PyModule_Create2 PyModule_Create2TraceRefs
 #define PyModule_FromDefAndSpec2 PyModule_FromDefAndSpec2TraceRefs
#endif

因此,您的编译器需要Python的自定义版本。

现在享受您的标准嵌入式python。

问题很可能是您在构建代码时使用的编译器标志与构建Python DLL中使用的标志不同。 特别是, PyModule_Create2TraceRefs只被定义,如果你有-DPy_TRACE_REFS (通常通过传递EXTRA_CFLAGSmake上的Unix命令;我不知道你是如何与英巴卡迪诺C ++ Builder的Windows上做到这一点)。 通常,这没有定义-特别是,如果您使用的是预构建Python二进制文件中的DLL,则不会定义它。

因此,如果要在构建代码时使用自定义标志,则需要使用相同的标志重建Python本身。 否则,您需要获取用于构建Python的标志,并在构建代码时使用相同的标志。

在Unix上,这很简单:只需调用python3.3-config --cflagspython3.3-config --ldflags即可将这些标志传递给您的编译和链接步骤。 在Windows上,它并不那么琐碎。 文档中的“ 在Windows上构建C和C ++扩展”一章介绍了当您使用与构建Python本身相同的工具链(通常是MSVC)时如何执行此操作,如果您将mingw与MSVC兼容功能一起使用,则有文档关于如何执行此操作的其他地方…但是,如果您使用其他工具链,则需要自己弄清楚其中的一些内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM