Windows系统下VS2008环境中调用python

因工作需要,需要在qualnet中编程实现机器学习算法,涉及在c++中调用python代码。经网上查询和实践,总结过程及遇到的问题如下:
        1.在VS2008中新建控制台项目cpython。        
        2.将本机python库文件拷贝至项目目录下。本人安装的是anacoda3版本python3.7,目录为C:/ProgramData/Anaconda3/include。该目录下应有pyconfig.h,即python的配置文件。若没有该文件,可在…/Anaconda3/pkgs/python-3.7.1/include下寻找,拷贝至项目目录。        
        3.查看pyconfig.h,第286-292行对库文件进行了配置,分别是python37_d.lib, python3.llib, python37.lib, 将这三个文件拷贝至项目目录。本机环境下,没有python37_d.lib库(用于debug模式),其余两个库文件在…/Anaconda3/libs下。        
        4.在项目文件cpython.cpp中编辑如下:
        #include “stdafx.h”
        #include “Python.h”
        int _tmain(int argc, _TCHAR* argv[])
        {
        Py_Initialize();
        PyRun_SimpleString(“print(‘hello’)”);
        Py_Finalize();
        getchar();
        return 0;
        }
        生成解决方案,报错:pyport.h(6): fatal error C1083: 无法打开包括文件:“inttypes.h”: No such file or directory        
        问题解决过程:
        a. 经查,inttypes.h为C99标准函数库的头文件,提供整数输入的各种转换宏。在linux系统下路径为:/usr/include/inttypes.h,VS2008下没有该头文件(头文件夹:C:/Program Files(x86)/Microsoft Visual Studio 9.0/VC/include/)。经多方查找,分别在两处找到inttypes.h源码:https://blog.csdn.net/ericbar/article/details/79575662列出了Ubuntu下的源码,包含features.h和stdint.h头文件。https://blog.csdn.net/qq_34732729/article/details/87187361列出了windows下的源码,包含_mingw.h、stdint.h和stddef.h头文件。使用源码新建头文件inttypes.h,放入VS2008头文件夹下,生成解决方案时报错:缺少_mingw.h头文件。        
        b. 查找_mingw.h,百度百科显示是VC的一个头文件,其他所有的头文件都包含它,并贴了源代码。新建该头文件后,放入VS2008的头文件夹下,生成解决方案时报错:缺少stdint.h头文件。        
        c. stdint.h是c99中引进的一个标准C库的头文件,定义了几种扩展的整数类型和宏。VS2008中不包含,VS2010之后版本包含。stdint.h同样有Linux和windows两种版本:https://blog.csdn.net/yucan1001/article/details/7470905为Linux版本;https://blog.csdn.net/qq_34732729/article/details/87187600为windows版本。新建stdint.h头文件放入VS2008的头文件夹下,生成解决方案时报错:
        stdint.h(32) : error C2144: 语法错误: “signed char”的前面应有“;”
        stdint.h(32) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int        
        d. 未能查到这两个错误的彻底解决方法。
        第一个错误,该行为:typedef signed char int8_t; 符号没有错误,其上下行也没有错误。即使将该行注释,下一行也照样报同样的错误。在一篇文章中提到一个不是办法的办法,在行首加一个“;”,试了之后居然就不报错了,这里暂且留着这个问题。
        第二个错误,https://blog.csdn.net/myyllove/article/details/102858051中提到,可强制排除4430来解决,即在项目属性——配置属性——C/C++——高级,禁用特定警告中输入4430,问题解决。重新生成解决方案,报错:LINK : fatal error LNK1104: 无法打开文件“python37_d.lib”。        
        e. 问题原因是生成项目方式为Debug,修改成Release,重新设置禁用特定警告4430(修改项目模式后需重新设置)。报错:
        error LNK2001: 无法解析的外部符号__imp__Py_Initialize
        error LNK2001: 无法解析的外部符号__imp__PyRun_SimpleStringFlags
        error LNK2001: 无法解析的外部符号__imp__Py_Finalize        
        f. https://blog.csdn.net/lingtianyulong/article/details/81142658博文中指出了问题所在。VS2008项目中配置平台是win32,而python是64位的。两种方法解决:python换成32位或VS2008项目平台换成x64。在VS2008项目中点击win32右侧的下拉框,选择配置管理器,在活动解决方案平台下点击新建,在平台选项选择x64。更换好平台后,还需重新设置禁用特定警告4430。
        生成解决方案成功,运行正常。

猜你喜欢

转载自blog.csdn.net/zhang1806618/article/details/104559414
今日推荐