Mac下安装python包的问题

昨天晚上到今天,尝试在我的Mac笔记本上安装一个师兄写的python包,花了很长时间都没能很好地解决问题。这个包的代码有python脚本,C和C++源代码。实际上,程序本来是用C/C++写的,现在只是用python进行了封装,方便调用。在程序包里,使用pybind11来进行python和C/C++代码的交互。在setup.py里,C/C++代码是通一个Pybind11Extension类来进行编译的。Linux下,通过执行

python setup.py install --user

可以很丝滑的完成程序包的安装。但是在Mac环境下,编译出现各种问题。

首先的问题是,Mac环境下默认的C/C++编译器是clang。而在Mac下,clang的默认C++标准是c++98。不管是代码中的lambda表达式,还是pybind11的标准要求,编译器起码需要按照c++11的标准来进行编译。所以我在setup.py文件里加了一个“-std=c++11”的编译选项。加了之后,cpp代码的编译时没有问题了。但是程序包里还有一些C代码。编译到它们的时候开始出现

error: invalid argument '-std=c++11' not allowed with 'C'

错误。

我没有仔细看Pybind11Extension是怎么实现的,不过看起来,对C和C++代码,这个类在进行编译的时候使用了完全相同的编译参数。我尝试把C代码后缀改成cpp,但是C代码中一些关于void 指针的用法应该是在C++标准中被废除了,仍然会出现编译错误。

我尝试能不能在编译安装之外找到什么设置,可以把clang的默认C++标准改成c++11。但是似乎没有合适的办法。这样就面临无解的局面。C和C++代码总有一部分无法完成编译,因此无法生成共享库。最后无奈,只能手动完成对代码的编译,在setup.py里把编译相关的部分注释掉。安装完成之后,再手动把共享库复制到程序包所在的目录。

这个事情真的是很扯,之前在Mac上安装esutil包也是碰到类似的问题。我实在没搞明白Mac为什么还把默认C++标准设置成c++11!而且没有什么方便的手段来修改默认设置。即使clang编译C代码的时候,对多余参数有更强的容忍度也没问题啊!

另一个可能的解决方案是,用gcc编译器替换掉clang。但是因为看到python显示匹配的编译器是clang,我没有进行这种设置。怀疑编译生成的共享库会无法通用。

Visits: 109

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

*