我想使用python binding
将c++ library
打包成pybind11
并将其上传到pip
。运行Cmake
和make
来单独编译绑定项目很容易。
但是,当我使用python setup.py时,Cmake在我的ld: library not found for -lstdc++
上抛出Mac Mojave
。
xcode-select --install
和open /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
下载并进行编译时,会引发相同的错误。
python3.6
,但都失败了,我创建了新的conda env py3.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
成功完成而没有任何错误
答案 0 :(得分:0)
该错误表明python构建中的某些内容会自动将-lstdc++
添加到编译器标志中,但是由于您已告诉clang使用-stdlib=libc++
,因此它不在包含libstdc ++的目录中查找(这是正确的,因为您告诉它不要使用libstdc ++)。
我认为python构建系统与libc ++不兼容,或者您需要找到某种方法来告诉它停止自动添加-lstdc++
。