jb3*_*326 4 c++ python macos setuptools
我正在尝试将Python包装器编译为我编写的小型C ++库。我编写了以下setup.py脚本以尝试setuptools用于编译包装器:
from setuptools import setup, Extension
import numpy as np
import os
atmcmodule = Extension(
'atmc',
include_dirs=[np.get_include(), '/usr/local/include'],
libraries=['mcopt', 'c++'], # my C++ library is at ./build/libmcopt.a
library_dirs=[os.path.abspath('./build')],
sources=['atmcmodule.cpp'],
language='c++',
extra_compile_args=['-std=c++11', '-v'],
)
setup(name='tracking',
version='0.1',
description='Particle tracking and MC optimizer module',
ext_modules=[atmcmodule],
)
Run Code Online (Sandbox Code Playgroud)
但是,当我python setup.py build在OS X El Capitan上运行时,clang抱怨找不到某些C ++标准库头文件:
In file included from atmcmodule.cpp:7:
In file included from ./mcopt.h:11:
In file included from ./arma_include.h:4:
/usr/local/include/armadillo:54:12: fatal error: 'initializer_list' file not found
#include <initializer_list>
^
1 error generated.
error: command 'gcc' failed with exit status 1
Run Code Online (Sandbox Code Playgroud)
将-v标志传递给编译器表明,它正在搜索以下包含路径:
#include <...> search starts here:
/Users/[username]/miniconda3/include
/Users/[username]/miniconda3/lib/python3.4/site-packages/numpy/core/include
/usr/local/include
/Users/[username]/miniconda3/include/python3.4m
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1/backward
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks (framework directory)
End of search list.
Run Code Online (Sandbox Code Playgroud)
显然,这不包括C ++标准库标头的路径。如果我使用该-v选项编译一个小型测试C ++源代码,则可以看到clang++通常也搜索该路径/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1,并且如果我在脚本中的include_dirs选项中包含此路径,则扩展模块可以正确编译并正常工作。但是,将此路径硬编码到脚本中似乎不是一个好的解决方案,因为该模块也需要在Linux上工作。Extensionsetup.py
因此,我的问题是如何正确地setuptools包含所需的标头?
至于setuptools试图编译的扩展,它打印它的运行的第一个命令:
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/[username]/miniconda3/include -arch x86_64 -I/Users/[username]/miniconda3/lib/python3.4/site-packages/numpy/core/include -I/Users/[username]/Documents/Code/ar40-aug15/monte_carlo/mcopt -I/usr/local/include -I/Users/[username]/miniconda3/include/python3.4m -c /Users/[username]/Documents/Code/ar40-aug15/monte_carlo/atmc/atmcmodule.cpp -o build/temp.macosx-10.5-x86_64-3.4/Users/[username]/Documents/Code/ar40-aug15/monte_carlo/atmc/atmcmodule.o -std=c++11 -fopenmp -v
Run Code Online (Sandbox Code Playgroud)
如果我将此命令粘贴到终端中并自己运行,则扩展会成功编译。因此,我怀疑是setuptools在修改一些我不知道的环境变量,还是在对其实际运行的命令稍加说谎。
Setuptools尝试使用与编译Python解释器相同的标志来编译C / C ++扩展模块。在检查了用于编译我的Python安装程序(来自Anaconda)的标志后,我发现它正在针对最低Mac OS X版本10.5进行编译。这似乎使其使用GCC libstdc ++而不是clang的libc ++(支持C ++ 11)。
可以通过将环境变量设置MACOSX_DEPLOYMENT_TARGET为10.9(或更高版本)或添加到来'-mmacosx-version-min=10.9'解决此问题extra_compile_args。