为什么“ld:找不到 -lstdc++ 的库”,当我使用 pybind11 为 c++ 库打包我的 python 绑定时
Why `ld: library not found for -lstdc++` when I package my python binding for a c++ library using pybind11
我想使用 pybind11
将我的python binding
打包为c++ library
并将其上传到 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
下载和编译时会抛出同样的错误。 - 非常,我在两台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
没有任何错误
该错误表明python构建中的某些内容会自动将-lstdc++
添加到编译器标志中,但是由于您告诉clang使用-stdlib=libc++
因此它不会查找包含libstdc++的目录(这是正确的,因为您告诉它不要使用libstdc++(。
我认为python构建系统与libc ++不兼容,或者您需要找到某种方法来告诉它停止自动添加-lstdc++
。
相关文章:
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 为什么操作系统正在更改我的数据包的指定传出端口
- 如何在我的项目包中使用C 库GTSAM
- GCC 以错误的方式解包(我<...)折叠表达式
- 如果我在 Windows 中编程我的深度数据包检测程序,我会错过什么主要的事情
- Rcpp:我的距离矩阵程序比包中的函数慢
- 我应该如何处理编写一段确定订阅包节省的代码的逻辑
- 如何告诉超级计算机上的C++编译器我的R包需要C++0x
- 如何使我的 Visual C++ 2013 应用程序不需要下载可再发行组件包
- 是否可以在不安装可分发的 VC++ 包的情况下将 MSVCRT DLL 与我的应用捆绑在一起
- 为什么我的凸包周长计算不起作用?
- 为什么启用 Windows 基本筛选引擎服务后,我的应用程序无法接收 UDP 数据包?
- 为什么我的模板参数包不起作用?
- vpackage开发使用c++,我如何初始化我的包时,启动visual studio
- 如何验证是否我的数据是x秒旧使用chrono包
- 如何更改以太网数据包(来自网卡的数据包)?我可以使用Netfilter钩子吗?
- 如何使用g++ 4.7或更新版本强制launchpad构建我的包?
- 我的包编译后,get函数可以工作,除了它打印随机数的doubles
- 为什么我的代码编译失败?(完美的转发和参数包)