前言:
项目中使用构建工具是cmake,为了集成我们的系统进去,需要使用cmake来调用swig,然后swig生成python可执行的库。
我的环境:
- win10
- swig 4.0.2
- python37
- visual studio 2019
- cmake 3.20.0-rc4
1.下载好swig之后,要把目录放入环境变量中。
考虑到下载速率可能很慢,我把swig的压缩包放在百度网盘了,注意直接下载解压,然后加入到环境变量就可以用了,不需要安装:
链接:https://pan.baidu.com/s/1keL2BVja-u-mg9hxtNkbBQ
提取码:hsqg
安装Python后设置PYTHON_PATH环境变量为python安装的根目录。
2.把msvc编译器的目录加到环境变量中:
我的电脑是这个,你的电脑应该是类似的
F:\apps\vs2019\ide\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64
3.python37安装时需要选择debug库,这样使用vs2019的debug模式生成才能找到。
然后去到这个目录
这里面是swig提供的示例代码。
现在复习一下编译过程,预编译->编译->汇编->链接。
我们程序员接触到最多的是编译和链接步骤,编译会去找头文件目录,链接会去找依赖的库,一般编译器报错就是这两个步骤,如果link error那代表你的库有问题,其他基本都是编译问题。
在simple_c目录下新建CMakeLists.txt文件,并且加入如下内容:
set(clib "clib")
set(pythonlib "examplePy")
project(simple_c)
cmake_minimum_required(VERSION 3.10)
cmake_policy(SET CMP0078 NEW)
cmake_policy(SET CMP0086 NEW)
# 编译C库
add_library(${clib} example.c)
# 编译pyd库
find_package(SWIG 4.0 COMPONENTS python)
if(NOT SWIG_FOUND)
message(FATAL_ERROR "error: Cannot find SWIG!")
endif()
include(${SWIG_USE_FILE})
# 注意这里我指定了3.7,可以根据需要修改为自己的版本
find_package(Python3 EXACT 3.7 COMPONENTS Interpreter Development REQUIRED)
swig_add_library(${pythonlib}
LANGUAGE python
SOURCES example.i
)
swig_link_libraries(${pythonlib} ${clib})
target_include_directories(${pythonlib} PRIVATE ${Python3_INCLUDE_DIRS})
# 加入链接库
set(python_path "$ENV{PYTHON_PATH}")
target_link_directories(${pythonlib} PRIVATE ${python_path}/libs)
然后新建build文件夹,在当前目录打开cmd,输入cmake ..,就可以生成项目
然后打开simple_c.sln,可以看到一个vs项目已经有了:
接下来开始生成库,为了可以在命令行调试,我们选择Release模式:
右键ALL_BUILD项目,选择生成:
去到build下的Release ,看到生成了如下文件
现在的pyd是可以直接导入的,但是为了方便去到上一层目录把example.py复制到Release目录
所以现在是这样
pyd相当于动态库。
在当前目录打开cmd输入python,然后引入example,调试C函数成功
知识点
- 安装Python时要选择加入debug库,否则debug模式就无法调试
总结:
如果在Windows里面使用gcc比较麻烦,遇到很多问题,然后我就用cmake+msvc这种方式来生成项目,比较方便。