首页 > 解决方案 > 导入 Python 3 时 Boost.Python 和 C++ 编译库错误

问题描述

在 Python 3 中,我试图导入用 C++ 编译的共享库。目前,我在 CentOS 7 上安装了这些软件包:

使用Boost.Python将C++greet.cpp中的简单文件编译为共享库。我在 youtube Simple Demo of Boost Python of Python calls C++ library上关注了一个视频,但由于某些原因未能找到。我不得不改变一些东西,最终我编译了所有东西,没有错误。但是,当我尝试将Python 解释器中的共享库作为模块导入时,我收到此错误:greet.soPython.hmakefilepygreet.soimport 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 $@

但仍然有同样的错误。

标签: c++python-3.xboost-python

解决方案


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。


推荐阅读