从Linking C module with Python 3.7. CMake in Windows开始,我试图从C库创建一个Python模块。我现在遇到另一个问题,因此我决定自己创建一个新问题:)
接下来的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
文件,并且在链接{{1}时失败}文件。
所以这是我在编译的最后一步中遇到的错误:
.dll
当我在初始化Python模块的函数中注释此行时,错误消失了
[ 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 3.7 32位。 MinGW也为32位(不是VS编译器),CLion和(可能不相关的)W10 x64。
我想念什么?相同的CMake文件足以在C中使用Python解释器,因此在某一时刻它找到了库。有任何想法吗?您需要我提供更多信息吗?
非常感谢