Связывание модуля C с Python 3.7.CMake в Windows - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь создать библиотеку C, которую можно вызывать из Python, поэтому я создал прокси-файл C, который предоставляет информацию о модуле и таблицу методов (для простоты добавлен только один метод get_cycle_count иего реализация не имеет значения):

static PyMethodDef NESulator_methods[] = {
        {"NESulator",  get_cycle_count, METH_VARARGS, "Retrieves the current cycle count"},
        {NULL, NULL, 0, NULL}        /* Sentinel */
};

static struct PyModuleDef NESulator_module = {
        PyModuleDef_HEAD_INIT,
        "NESulator",    /* name of module */
        NULL,           /* module documentation, may be NULL */
        -1,             /* size of per-interpreter state of the module,
                           or -1 if the module keeps state in global variables. */
        NESulator_methods
};

/*
 * Should this be called somewhere? Will the linker do something with this?
 */
PyMODINIT_FUNC PyInit_NESulator(void)
{
    return PyModule_Create(&NESulator_module);
}

Теперь в документации говорится, что (очевидно) моя библиотека C должна как-то обрабатываться, чтобы Python мог ее импортировать.Я дошел до того, что создал библиотеку C вместо исполняемого файла с CMake (и CLion, а не VS, так что компилятор gcc из MinGW), но я не могу найти и понять, как я должен делать это с CMake.

Этот фрагмент CMake создает файл с именем libNESulator.a, но файлы dll или lib не создаются, а файл .py (в том же месте, что и библиотека .a) не можетнайдите его при выполнении import libNESulator или import NESulator, причем последнее является именем, определенным в структуре PyModuleDef.Так что я уверен, что там чего-то не хватает

project(NESulator)
set(CMAKE_C_STANDARD 11)
add_subdirectory(src)

find_package(PythonLibs REQUIRED)

include_directories(${PYTHON_INCLUDE_DIRS})

add_library(NESulator "all of my .c files in the src directory previously included" )

target_link_libraries(NESulator ${PYTHON_LIBRARIES})

Итак ... да, у вас есть идеи, как превратить этот libNESulator.a в вызываемый модуль Python?Что мне нужно сделать в этом CMake, чтобы это произошло?

Если у вас есть более простой способ сделать это или каким-либо другим способом, пожалуйста, не стесняйтесь предлагать это.Я довольно новичок в CMake и Python, поэтому я не знаю, нужна ли вам дополнительная информация от меня, например, о структуре проекта или около того, но, пожалуйста, дайте мне знать, если вы это сделаете.

Большое спасибо

...