簡體   English   中英

Python setuptools不包括C ++標准庫頭

[英]Python setuptools not including C++ standard library headers

我正在嘗試將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 ,如果我在setup.py腳本中的Extensioninclude_dirs選項中包含此路徑,則擴展模塊可以正確編譯並運行。 但是,將此路徑硬編碼到腳本中似乎不是一個好的解決方案,因為此模塊還需要在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是修改了一些我不知道的環境變量,或者它對它實際運行的命令有點了解。

Setuptools嘗試使用與編譯Python解釋器相同的標志來編譯C / C ++擴展模塊。 檢查用於編譯我的Python安裝的標志 (來自Anaconda)后,我發現它正在編譯10.5的最低Mac OS X版本。 這似乎使它使用GCC libstdc ++而不是clang的libc ++( 它支持C ++ 11 )。

這可以通過將環境變量MACOSX_DEPLOYMENT_TARGET設置為10.9 (或更高版本),或將'-mmacosx-version-min=10.9'extra_compile_argsextra_compile_args

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM