<分区>
我想使用 pybind11
为 c++ 库
打包我的 python 绑定(bind)
,并将其上传到 pip
。运行 Cmake
和 make
来单独编译绑定(bind)项目很容易。
但是,当我使用 python setup.py 时,Cmake 在我的 Mac Mojave
上抛出 ld: library not found for -lstdc++
。
- 我试过
xcode-select --install
并
打开/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
它们都安装正确。此外,我已经尝试了
sudo python setup.py sdist build
,然后是python setup.py sdist build
,令人惊讶的是它确实有效!但是,当我从pip install my-package
下载和编译时,会抛出同样的错误。- 奇怪的是,我在两台 Mac 上都使用了 anaconda
python3.6
,但都失败了,我创建了新的 conda envpy3.7
,安装成功!!!我也用/usr/local/bin/python3(3.4)也成功了!!!
我的setup.py是这样的:
import os
import sys
import pathlib
from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext as build_ext_orig
class CMakeExtension(Extension):
def __init__(self, name):
# don't invoke the original build_ext for this special extension
super().__init__(name, sources=[])
class build_ext(build_ext_orig):
def run(self):
for ext in self.extensions:
self.build_cmake(ext)
super().run()
def build_cmake(self, ext):
# example of build args
build_args = ['--config', 'Release', '--', '-j4']
cwd = pathlib.Path().absolute()
build_temp = pathlib.Path(self.build_temp)
build_temp.mkdir(parents=True, exist_ok=True)
os.chdir(str(build_temp))
self.spawn(['cmake', str(cwd)])
if not self.dry_run:
self.spawn(['cmake', '--build', '.'] + build_args)
os.chdir(str(cwd))
setup(
...
install_requires=['numpy', 'pybind11'],
include_package_data=True,
ext_modules=[CMakeExtension('xxx')],
cmdclass={
'build_ext': build_ext,
}
)
我主要是从 https://stackoverflow.com/a/48015772/7961269 复制的
我的 CMakeLists.txt 是:
cmake_minimum_required(VERSION 2.8.12)
project(xxx)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
find_package(pybind11 REQUIRED)
include_directories(...)
pybind11_add_module(xxx xxx/xxx.cpp)
希望我可以 pip install my-package
成功,没有任何错误