Компиляция кода C, созданного CFFI emit_c_code () из pypy 7.3.1, не выполняется в VS 2019 из-за неразрешенных внешних символов - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь создать .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

Есть ли у кого-нибудь подсказки?

...