【问题标题】:Python setuptools not including C++ standard library headersPython setuptools 不包括 C++ 标准库头文件
【发布时间】:2016-02-17 18:12:01
【问题描述】:

我正在尝试将 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],
      )

但是,当我在 OS X El Capitan 上运行 python setup.py build 时,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

-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.

这显然不包括 C++ 标准库头文件的路径。如果我使用-v 选项编译一个小型测试C++ 源代码,我可以看到clang++ 通常也会搜索路径/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1,如果我将此路径包含在include_dirs 选项中Extension 在我的@ 987654334@ 脚本,然后扩展模块正确编译并工作。但是,将此路径硬编码到脚本中似乎不是一个好的解决方案,因为此模块也需要在 Linux 上运行。

那么,我的问题是如何正确地使setuptools 包含所需的标头?

更新(2015 年 11 月 22 日)

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

如果我将此命令粘贴到终端并自己运行,则扩展编译成功。所以我怀疑setuptools 正在修改一些我不知道的环境变量,或者它对它实际运行的命令有点撒谎。

【问题讨论】:

    标签: python c++ macos setuptools


    【解决方案1】:

    Setuptools 尝试使用 same flags used to compile the Python interpreter 编译 C/C++ 扩展模块。在 checking the flags 用于编译我的 Python 安装(来自 Anaconda)之后,我发现它正在编译的最低 Mac OS X 版本为 10.5。这似乎使它使用 GCC libstdc++ 而不是 clang 的 libc++ (which supports C++11)。

    这可以通过将环境变量MACOSX_DEPLOYMENT_TARGET 设置为10.9(或更高版本)或将'-mmacosx-version-min=10.9' 添加到extra_compile_args 来解决。

    【讨论】:

    • 你知道为什么在运行setup.py时这些参数没有显示吗?
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2021-04-28
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多