python - 为什么当我使用 pybind11 为 C++ 库打包我的 python 绑定(bind)时出现 `ld: library not found for -lstdc++`

标签 python c++ cmake pip pybind11

<分区>

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

  1. 我试过 xcode-select --install
  2. 打开/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 上都使用了 anaconda 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 成功,没有任何错误

最佳答案

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

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

关于python - 为什么当我使用 pybind11 为 C++ 库打包我的 python 绑定(bind)时出现 `ld: library not found for -lstdc++`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56670376/

相关文章:

python - 我需要找到用户输入数字列表的平均值,但有些东西不起作用

python - 由于单引号和双引号,正则表达式不工作

c++ - Ofstream 效果不佳?

c++ - CMake关于类依赖的 undefined reference 错误

配置时发生cmake错误

python - 如何将一个字节分成上半部和下半部

python - 根据转换是否可以增量运行来更改输入

C++ 字符数组特征 : why does a string stop before the end of the array?

c++ - 绕过SDL2中的 "int main(int argc, char** argv)"

cmake - 如何使CMake重新配置依赖于自定义文件?