c++ - 导入 Python 3 时 Boost.Python 和 C++ 编译库错误
问题描述
在 Python 3 中,我试图导入用 C++ 编译的共享库。目前,我在 CentOS 7 上安装了这些软件包:
g++ --version
-> g++ (GCC) 4.8.5 20150623 (红帽 4.8.5-28)conda list anaconda$
-> Anaconda 3 版本 5.2.0 与构建通道 py36_3
使用Boost.Python将C++greet.cpp
中的简单文件编译为共享库。我在 youtube Simple Demo of Boost Python of Python calls C++ library上关注了一个视频,但由于某些原因未能找到。我不得不改变一些东西,最终我编译了所有东西,没有错误。但是,当我尝试将Python 解释器中的共享库作为模块导入时,我收到此错误:greet.so
Python.h
makefile
pygreet.so
import pygreet
ImportError: /home/.../cpp/code/pygreet.so: undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
我试图看看这是什么东西:nm pygreet.so | less -p "_ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE"
并找到了这些行:
0000000000008916 W _ZN5boost6python3da simpleefIPFSsvEEEvPKcT_
U _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
我是使用共享库的初学者,我真的不知道如何继续。下面,我将展示这些文件,以防有人看到我遗漏了一些重要的东西。
谢谢。
问候.cpp:
#include <string>
#include <boost/python.hpp>
namespace py = boost::python;
std::string greet() {
return "hello, world";
}
int square(int number) {
return number * number;
}
BOOST_PYTHON_MODULE(pygreet)
{
// Add regular functions to the module.
py::def("greet", greet);
py::def("square", square);
}
生成文件:
CXX = g++
PYLIBPATH = $(shell python3-config --exec-prefix)/lib
LDFLAGS = -L$(PYLIBPATH)
LFLAGS = $(shell python3-config --libs) -lboost_python
CFLAGS = -Wall -Werror
INCLUDES = $(shell python3-config --includes)
SOURCE = greet.cpp
TARGET = pygreet.so
OBJ = $(SOURCE:.cpp=.o)
default: $(TARGET)
@echo $(TARGET) compiled!
$(TARGET): $(OBJ)
$(CXX) $(CFLAGS) $(LDFLAGS) $(LFLAGS) -Wl,-rpath,$(PYLIBPATH) -shared $< -o $@
greet.o: $(SOURCE)
$(CXX) $(CFLAGS) $(INCLUDES) -fpic -c $< -o $@
clean:
rm -rf *.so *.o
.PHONY: deafult clean
编辑。
正如评论中所建议的,我更改了以下行makefile
:
PYLIBPATH = $(shell python3-config --exec-prefix)/lib
LDFLAGS = -L$(PYLIBPATH)
LFLAGS = $(shell python3-config --libs) -lboost_python
至
PYLIBPATH = $(shell python3-config --exec-prefix)
LDFLAGS = $(shell python3-config --ldflags) -lboost_python
接着
$(CXX) $(CFLAGS) $(LDFLAGS) $(LFLAGS) -Wl,-rpath,$(PYLIBPATH) -shared $< -o $@
至
$(CXX) $(CFLAGS) $(LDFLAGS) -Wl,-rpath,$(LDFLAGS) -shared $< -o $@
但仍然有同样的错误。
解决方案
Boost 为 Python 2 和 Python 3 提供了单独的库。如果您使用的是 Python 3,则需要链接到 Python 3 特定的库,否则在模块加载时会出现未定义的符号错误。
在 Ubuntu 上,该库可能被称为libboost_python-py35.so
. 我很确定(但没有验证)boost.python 库的不同次要版本是向上兼容的,因此您可以libboost_python-py35.so
与 Python 3.6 一起使用。
如果你的系统上没有这样的库,很可能你的发行版没有发布它,在这种情况下,你需要从源代码构建 boost.python。
推荐阅读
- python - Dronekit 上传到 Pixhawk 4 - 舍入问题
- ios - 如何从一个故事板导航到另一个 TabBarController?
- c# - C# 无法返回值“并非所有代码路径都返回值”错误
- vue.js - core-js 依赖项警告 [vue]
- java - 日期转换在转换为时间戳时返回错误的日期
- python - 关联 .csv 列数据以进行计算
- c# - 我想将 "B101" 这个 id 增加到 "B102" ,我该如何使用溢出方法来做到这一点?
- reactjs - 如何将用户输入数据从功能子组件发送到父类组件?
- javascript - 两级在Javascript中添加更多文件
- react-native - Undefined is not a function {near This.state} 反应原生错误