Я пытаюсь создать .dll, который я могу вызвать в своих проектах C ++, что позволит мне запустить некоторый код python с использованием pypy.
Я следовал руководству здесь https://cffi.readthedocs.io/en/latest/embedding.html
Это файл заголовка, который я создал:
/* file pbe_c_bindings.h, Windows-friendly version
When including this file from ffibuilder.set_source(), the
following macro is defined to '__declspec(dllexport)'. When
including this file directly from your C program, we define
it to 'extern __declspec(dllimport)' instead.
With non-MSVC compilers we simply define it to 'extern'.
(The 'extern' is needed for sharing global variables;
functions would be fine without it. The macros always
include 'extern': you must not repeat it when using the
macros later.)
*/
#ifndef CFFI_DLLEXPORT
# if defined(_MSC_VER)
# define CFFI_DLLEXPORT extern __declspec(dllimport)
# else
# define CFFI_DLLEXPORT extern
# endif
#endif
typedef int(*my_doing)(char*);
typedef void(*my_log)(char*, char*);
CFFI_DLLEXPORT void init_pbe(char*, my_doing, my_log);
CFFI_DLLEXPORT char* code_document(char*);
Это сценарий python для генерации кода C:
import cffi
ffibuilder = cffi.FFI()
header_file = 'pbe_c_bindings.h'
with open(header_file) as f:
# read pbe_c_bindings.h and pass it to embedding_api(), manually
# removing the '#' directives and the CFFI_DLLEXPORT
data = ''.join([line for line in f if not line.startswith('#')])
data = data.replace('CFFI_DLLEXPORT', '')
ffibuilder.embedding_api(data)
ffibuilder.set_source('pbe_c_bindings', r'''
#include "pbe_c_bindings.h"
''')
embedded_init_file = 'embedded_init.py'
with open(embedded_init_file) as f:
embedded_init_code = ''.join([line for line in f if not line.startswith('#')])
ffibuilder.embedding_init_code(embedded_init_code)
c_file = 'pbe_c_bindings.c'
ffibuilder.emit_c_code(c_file)
И это встроенный код инициализации:
from pbe_c_bindings import ffi
from pbe_coder import make_coder
pbe = None
@ffi.def_extern()
def init_pbe(config_str, doing, log):
pbe = make_coder(config_str, doing, log)
@ffi.def_extern()
def code_document(xml_str):
engine_output = pbe.code_from_wrapper(xml_str)
return ffi.new('char[]', engine_output)
Я создал простой проект VS2019 C ++, который я настроил, чтобы содержать файл заголовка, сгенерированный файл, и связал папку include моего дистрибутива pypy так, чтобы Python .h можно найти.
При компиляции я получаю два неразрешенных внешних символа:
unresolved external symbol _pypy_init_embedded_cffi_module referenced in function __cffi_initialize_python
unresolved external symbol _pypy_carefully_make_gil referenced in function __cffi_carefully_make_gil
Есть ли у кого-нибудь подсказки?