为什么当我使用pybind11打包C ++库的python绑定时,找不到-lstdc ++的ld库?

时间:2019-06-19 14:42:03

标签: python c++ cmake pip pybind11

我想使用python bindingc++ library打包成pybind11并将其上传到pip。运行Cmakemake来单独编译绑定项目很容易。 但是,当我使用python setup.py时,Cmake在我的ld: library not found for -lstdc++上抛出Mac Mojave

  1. 我已经尝试过xcode-select --install
  2. open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg 他们两个都安装正确。

  3. 此外,我尝试过sudo python setup.py sdist build,然后尝试python setup.py sdist build,但确实如此!但是,当我从pip install my-package下载并进行编译时,会引发相同的错误。

  4. 很抱歉,我在两台Mac上使用了蟒蛇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成功完成而没有任何错误

1 个答案:

答案 0 :(得分:0)

该错误表明python构建中的某些内容会自动将-lstdc++添加到编译器标志中,但是由于您已告诉clang使用-stdlib=libc++,因此它不在包含libstdc ++的目录中查找(这是正确的,因为您告诉它不要使用libstdc ++)。

我认为python构建系统与libc ++不兼容,或者您​​需要找到某种方法来告诉它停止自动添加-lstdc++