前言:

项目中使用构建工具是cmake,为了集成我们的系统进去,需要使用cmake来调用swig,然后swig生成python可执行的库。

我的环境:

  • win10
  • swig 4.0.2
  • python37
  • visual studio 2019
  • cmake 3.20.0-rc4

cmake文件中变量想在python脚本中调用如何使用 python cmake_visual studio

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模式生成才能找到。

cmake文件中变量想在python脚本中调用如何使用 python cmake_SWIG_02

然后去到这个目录

cmake文件中变量想在python脚本中调用如何使用 python cmake_visual studio_03

这里面是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 ..,就可以生成项目

cmake文件中变量想在python脚本中调用如何使用 python cmake_python_04

cmake文件中变量想在python脚本中调用如何使用 python cmake_环境变量_05

 然后打开simple_c.sln,可以看到一个vs项目已经有了:

cmake文件中变量想在python脚本中调用如何使用 python cmake_环境变量_06

接下来开始生成库,为了可以在命令行调试,我们选择Release模式:

右键ALL_BUILD项目,选择生成:

cmake文件中变量想在python脚本中调用如何使用 python cmake_python_07

去到build下的Release ,看到生成了如下文件

cmake文件中变量想在python脚本中调用如何使用 python cmake_SWIG_08

现在的pyd是可以直接导入的,但是为了方便去到上一层目录把example.py复制到Release目录

cmake文件中变量想在python脚本中调用如何使用 python cmake_visual studio_09

所以现在是这样

cmake文件中变量想在python脚本中调用如何使用 python cmake_环境变量_10

pyd相当于动态库。

在当前目录打开cmd输入python,然后引入example,调试C函数成功

cmake文件中变量想在python脚本中调用如何使用 python cmake_visual studio_11

知识点

  • 安装Python时要选择加入debug库,否则debug模式就无法调试

总结:

如果在Windows里面使用gcc比较麻烦,遇到很多问题,然后我就用cmake+msvc这种方式来生成项目,比较方便。