Исходя из Связывание модуля C с Python 3.7.CMake в Windows Я пытаюсь создать модуль Python из библиотеки C.Сейчас я сталкиваюсь с другой проблемой, поэтому я решил создать новый вопрос сам по себе :)
Следующий фрагмент CMake сгенерирует мне .a
файл
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")
target_link_libraries(NESulator ${PYTHON_LIBRARIES})
, которыйэто не то, что нужно Python для принятия и импорта модуля.Это должен быть .dll
, поэтому я добавил ключевое слово SHARED
в эту строку add_library(NESulator SHARED "all of my .c files " )
, и теперь он создает файл .dll.a
и завершается ошибкой при связывании файла .dll
.
Вот ошибка, которую я получаю на последнем этапе компиляции:
[ 92%] Building C object src/CMakeFiles/NESulator.dir/gui/python_gui_wrapper.c.obj
[100%] Linking C shared library libNESulator.dll
CMakeFiles\NESulator.dir/objects.a(python_gui_wrapper.c.obj): In function PyInit_NESulator:
/src/gui/python_gui_wrapper.c:21: undefined reference to `_imp__PyModule_Create2'
collect2.exe: error: ld returned 1 exit status
src\CMakeFiles\NESulator.dir\build.make:278: recipe for target 'src/libNESulator.dll' failed
mingw32-make.exe[3]: *** [src/libNESulator.dll] Error 1
CMakeFiles\Makefile2:89: recipe for target 'src/CMakeFiles/NESulator.dir/all' failed
И ошибка исчезает, когда я комментирую эту строку внутри функции, которая инициализирует модуль Python
PyMODINIT_FUNC PyInit_NESulator(void)
{
return PyModule_Create(&NESulator_module);
}
Но, конечно, мне это нужно!поэтому я не могу просто проигнорировать это.
Для вашей информации, я использую Python 3.7 32 бита.MinGW 32 бит (не компилятор VS), CLion и (вероятно, не имеет значения) W10 x64.
Чего мне не хватает?Одного и того же файла CMake было достаточно, чтобы использовать интерпретатор Python в C, так что в какой-то момент он нашел библиотеки.Есть идеи?Вам нужно больше информации от меня?
Большое спасибо