VS2019编译自动微分库ADOL-C并利用SWIG打包为.pyd文件

目录

前言

一、VS编译ADOL-C

二、SWIG生成.py和.cxx接口文件

 三、VS编译.cxx生成.pyd

1. VS项目属性配置

 2. 生成.pyd文件


前言

自动微分库ADOL-C提供了SWIG+Python的接口文件,在./ADOL-C/swig/文件夹中,并且写好了setup.py文件为Python安装adolc模块。但是setup.py的安装命令是为Linux环境编写的,在Windows下根本无法直接运行安装。因此,需要我们用Visual Studio手动进行编译。

整篇教程可以分为三步:VS编译ADOL-C、SWIG生成.py和.cxx接口文件、VS编译.cxx生成.pyd。

因此需要以下环境:

1. Visual Studio,版本可以不同;

2. MSYS2环境安装mingw-w64-x86_64-gcc 或 在Windows中安装Mingw64,可以在命令行中调用g++命令(如图,g++ --version),主要需要在第2步中使用;

3. Python环境,原生环境或Anaconda虚拟环境均可;

4. SWIG,可以在命令行中调用swig命令(如图,swig -version)。

提示:以下是本篇文章正文内容,下面案例可供参考

一、VS编译ADOL-C

 在./MSVisualStudio/v14/文件夹下有编译教程README_VC++.md,根据步骤编译即可,得到的adolc.dll和一系列.obj文件在x64文件夹中,后续需要用到。

二、SWIG生成.py和.cxx接口文件

ADOL-C和Python之间的接口规则定义写在adolc-python.i文件中,因此使用SWIG生成接口文件的命令如下:

swig --python -c++ -dirvtable -o adolc_python_wrap.cxx adolc-python.i

 但是, 在swig/文件夹中直接运行以上命令会报错:

adolc-python.i(221) : Error: Unable to find 'adolc_all.hpp'

 查看setup.py文件中的编译规则,发现首先需要生成adolc_all.hpp,调用了swigprocess.py中的prepare_flat_header()函数,prepare_flat_header()函数调用了invoke_cpp()函数,这个函数里面用到os.environ['CXX']:

s = os.environ['CXX'] + ' -std=c++11 -E -C -P -o ' + outfile + ' -Iinclude -nostdinc -DSWIGPRE ' + infile

在Windows环境中会报错找不到'CXX',因此将其改为:

s = 'g++ -std=c++11 -E -C -P -o ' + outfile + ' -Iinclude -nostdinc -DSWIGPRE ' + infile

 进入Python命令行,执行以下语句:

>>> from swigprocess import prepare_flat_header
>>> prepare_flat_header()

在当前目录中生成了 adolc_all.hpp,再调用swig命令生成接口文件:

swig --python -c++ -dirvtable -o adolc_python_wrap.cxx adolc-python.i

三份新文件: adolc.py, adolc_python_wrap.cxx和adolc_python_wrap.h,adolc.py是供Python调用的,剩下两个需要在VS中编译生成_adolc.pyd文件被adolc.py调用。

 三、VS编译.cxx生成.pyd

1. VS项目属性配置

在VS中创建空项目,配置项目属性,选择Release x64模式。配置类型为dll

 目标文件扩展名改为.pyd,或者这里不改,生成dll后改为_adolc.pyd

 VC++目录 —> 包含目录 添加ADOL-C头文件、Python头文件和NumPy头文件

 VC++目录 —> 库目录 添加ADOL-C库文件目录、Python库文件目录

 链接器 —> 常规 —> 附加库目录 添加ADOL-C库文件目录、Python库文件目录

 链接器 —> 输入 —> 附加依赖项 添加ADOL-C库文件和Python库文件,下面是我用VS编译ADOL-C nosparse x64模式生成的.lib和.obj文件。如果链接器报错,核对.obj文件是否都添加了,以及pythonxx.lib的版本和路劲是否都是正确的。

python38.lib
adolc.lib
adalloc.obj
adolc_lie.obj
adolc_lie_c.obj
adouble.obj
adouble_tl.obj
adouble_tl_hov.obj
adouble_tl_indo.obj
advector.obj
checkpointing.obj
convolut.obj
drivers.obj
driversf.obj
externfcts.obj
externfcts2.obj
fixpoint.obj
fortutils.obj
forward_partx.obj
fos_forward.obj
fos_pl_forward.obj
fos_pl_reverse.obj
fos_pl_sig_forward.obj
fos_pl_sig_reverse.obj
fos_reverse.obj
fov_forward.obj
fov_offset_forward.obj
fov_pl_forward.obj
fov_pl_sig_forward.obj
fov_reverse.obj
hos_forward.obj
hos_ov_reverse.obj
hos_reverse.obj
hov_forward.obj
hov_reverse.obj
hov_wk_forward.obj
indopro_forward_pl.obj
indopro_forward_s.obj
indopro_forward_t.obj
interfaces.obj
interfacesf.obj
int_forward_s.obj
int_forward_t.obj
int_reverse_s.obj
int_reverse_t.obj
nonl_ind_forward_s.obj
nonl_ind_forward_t.obj
nonl_ind_old_forward_s.obj
nonl_ind_old_forward_t.obj
odedrivers.obj
odedriversf.obj
param.obj
psdrivers.obj
psdriversf.obj
revolve.obj
rpl_malloc.obj
sparsedrivers.obj
sparse_fo_rev.obj
tapedoc.obj
tape_handling.obj
taping.obj
taylor.obj
zos_forward.obj
zos_pl_forward.obj

 2. 生成.pyd文件

使用SWIG生成接口文件后,将swig/目录下的.h, .hpp和.cxx文件共8个文件复制到VS项目的路径下,并添加进项目。

最终项目的文件结构应该如下:

生成 —> 生成解决方案 (或者F7快捷键),.pyd文件生成在./x64/Release目录下,改名为_adolc.py,和adolc.py放到一起,测试例子能否跑通。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值