设为首页 收藏本站
查看: 591|回复: 0

[经验分享] 在MinGW中编译Boost.Python

[复制链接]

尚未签到

发表于 2017-4-29 07:02:23 | 显示全部楼层 |阅读模式
  有时候,我写程序纯粹是为了好玩。比如,对于Python和Boost。身边很多朋友,看我兴致勃勃的学习它,会常看外星人一样地问我:“这有什么用吗?”
  我开始觉得很郁闷,后来就学会一笑处之。何必要去争呢?为了生存而生活,并不是什么错误的态度,不过,抱这样态度的朋友,不可能向他们说清楚,这种生活的乐趣。如果只­是为了谋生,我就应该一辈子安心于使用RAD。但是,我喜欢C++,喜欢Python。这样的语言,可以让我得到乐趣。虽然我可能永远也成不了Bjarne,但是,我可以做一个快乐的人,这不是很好吗?
  做为一个纯粹的C++“爱好者(而非职业C++程序员)”,我很少使用VC。很长时间里,我一直在用内置GCC的Dev C++。后来,又专门下载了一个MinGW,集成在Dev C++中,做为编译器内核。不知道CSDN上有多少像我这样的“玩家”。不过,从前一段时间论坛上的贴子来看,所有像我这样使用MinGW+Python+Boost的朋友,都遇到一个很头痛的问题:Boost.Python不能安装。
  这个问题的具体表现在于,用MinGW编译Boost.Python时,会提示找不到若干定义,最后归为6个以上的错误。具体的数目好像会有不同。我的机器上通常会是6个,而有一位朋友,他的机器编译时一般是9个错误。这个问题困扰了我们这些C++菜鸟很久。因为同样的问题在VC上就不会出现。最后,一个偶然的机会,我发现,其实,这个问题一点也不神秘:在Boost.Pyhton的编译过程中,需要调用一个静态库pythonxx.lib(xx是两位数字,视Python的版本而定,我这里是Python22.lib)。而Python的Windows版本,是使用VC编译的!所以在VC中,不会出现这样的问题。而MinGW通常不能正确的识别这个VC编译出的静态库。同样的问题不只出在编译Boost.Python。只要使用安装版的Python与MinGW集成使用,都会出现这个问题。
  怎么办?用MinGW重编译Python源码?这听起来是个好主意,从根本上解决问题。不过让我很失望的是,在我这里,用Cygwin还可以正确编译Python源码,MinGW就不行。大概是因为我的方法不当。如果哪位高人了解,还请指教。而从另一个角度看,只要能得到一个MinGW编译的lib文件就可以。而这个方法,其实在Python的文档中已经提到了--虽然没有说与Boost.Python有关,但是,这的确是最简单的方法。下面我把它整理出来,介绍一下。
  1、我们需要一个工具,用来生成Python22.lib的Def文件。这个Def,其实是从Python22.DLL(动态链接库是语言及编译器无关的)得到的。先下载PExports 0.42h( http://starship.python.net/crew/kernr/mingw32/pexports-0.42h.zip)。解压缩后可以在Bin目录中找到一个可执行文件pexports.exe。为了方便,我们可以把这个目录加到path中;
  2、在系统目录中找到python22.dll,把它复制到一个单独的目录中(我把它放在我的python/DLLs里,为的是一并处理掉其它的DLL);
  3、在命令行模式下,转到放置python22.dll的目录,执行:pexports python22.dll >python22.def;
  4、现在,我们在这个目录下,可以找到python22.def,用文本编辑器打开它,会看到在编译Boost.Python时找不到的那些定义,就在其中;
  5、使用GCC的附带工具,生成静态文件,现在执行:dlltool --dllname python22.dll --def python22.def --output-lib python22.lib。
  我们现在就可以在这个目录下,找到梦寐以求的python22.lib了。
  用同样的方法,我生成了MinGW版本的其它若干个lib文件,如zlib.lib,parser.lib等。现在,把它们放在一个新的目录中(也可以在生成它们时,直接指定一个目录)。把Boost.Python所需要的libs目录变量设定为这个目录,就可以正确编译Boost.python了!
  欢迎所有使用MinGW的朋友来到Boost.Python的世界!这个时候,大概你已经在试验Boost的示例,甚至自己开始用Boost扩展Python了吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370547-1-1.html 上篇帖子: (转载)win7 下配置cocos2d-python 下篇帖子: [Python]文件的创建与追加
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表