Установочные инструменты Python, не включающие заголовки стандартной библиотеки C ++

Я пытаюсь скомпилировать оболочку 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],
)

Тем не менее, когда я бегу 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

Проходя -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 ++. Если я скомпилирую небольшой исходный код C ++ с -v вариант, я вижу, что clang++ обычно также ищет путь /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1и если я включу этот путь в include_dirs вариант для Extension в моем setup.py скрипт, тогда модуль расширения компилируется корректно и работает. Однако жесткое программирование этого пути в сценарии не кажется хорошим решением, так как этот модуль также должен работать в Linux.

Итак, мой вопрос как правильно сделать 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

Если я вставляю эту команду в терминал и запускаю ее самостоятельно, расширение успешно компилируется. Так что я подозреваю, что либо setuptools изменяет некоторые переменные окружения, о которых я не знаю, или лжет о командах, которые он на самом деле выполняет

2

Решение

Setuptools пытается скомпилировать модули расширения C / C ++ с те же флаги, используемые для компиляции интерпретатора Python. После проверка флагов Я использовал для компиляции мою установку Python (от Anaconda), я обнаружил, что она компилируется для минимальной версии Mac OS X 10.5 Это, кажется, заставляет его использовать GCC libstdc ++ вместо libc ++ clang (который поддерживает C ++ 11).

Это можно исправить, установив переменную среды MACOSX_DEPLOYMENT_TARGET в 10.9 (или позже), или добавление '-mmacosx-version-min=10.9' в extra_compile_args,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]