Я пытаюсь встроить Python в свое приложение на C ++, но компоновщик продолжает повторять эту ошибку:
[ILINK32 Error] Error: Unresolved external '_PyModule_Create2TraceRefs' referenced from E:\CPP PROJECTS\ANDERLICHT\WIN32\DEBUG\ANDERLICHT.OBJ
Я использую Embarcadero C ++ Builder XE2, поэтому я преобразовал python33.lib с помощью coff2omf.exe.
Это мой код в 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. Что мне нужно сделать, чтобы исправить эту ошибку?
Скорее всего, проблема заключается в том, что при сборке кода вы используете флаги компилятора, отличные от используемых при сборке библиотеки Python. Особенно, PyModule_Create2TraceRefs
определяется только если у вас есть -DPy_TRACE_REFS
(который обычно проходит через EXTRA_CFLAGS
в make
команда на Unix; Я понятия не имею, как вы делаете это с Embarcadero C ++ Builder на Windows). Обычно это не определено — в частности, если вы используете DLL из предварительно скомпилированного двоичного файла Python, он не будет определен.
Итак, если вы хотите иметь собственные флаги при сборке кода, вам нужно пересобрать сам Python с теми же флагами. В противном случае вам нужно получить флаги, которые использовались для сборки Python, и использовать те же флаги при сборке кода.
В Unix это тривиально: просто позвоните python3.3-config --cflags
а также python3.3-config --ldflags
чтобы получить флаги для перехода к этапам компиляции и ссылки. В Windows это менее тривиально. Сборка расширений C и C ++ в Windows Глава в документации объясняет, как это сделать, когда вы используете тот же набор инструментов, который использовался для сборки самого Python (обычно MSVC), и если вы используете mingw с его функциями MSVC-compat, в другом месте есть документация о том, как это сделать … но Если вы используете другой набор инструментов, вам нужно будет самому разобраться в этом.
У меня была такая же проблема, но я нашел решение, которое не нуждается в восстановлении.
Если вы разрабатываете новое приложение, вы находитесь в режиме отладки: компилятор определяет _DEBUG. В файле «pyconfig.h» (около строки 336 для python 3.6.3) вы можете найти:
#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.
Теперь наслаждайтесь вашим стандартным встроенным питоном.