在Python3中,我试图导入一个用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中的一个简单文件编译为共享库greet.so。我在youtube Boost Python调用C++库的简单演示上看了一段视频,但由于一些原因,它没能找到Python.h。我不得不在makefile中修改了一些东西,最终没有错误地编译了所有内容。但是,当我尝试将共享库pygreet.so作为模块:import pygreet导入Python解释器时,我得到了以下错误:
ImportError: /home/.../cpp/code/pygreet.so: undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE我试着看看这个东西是什么:nm pygreet.so | less -p "_ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE"并找到了这一行:
0000000000008916 W _ZN5boost6python3da simpleefIPFSsvEEEvPKcT_
U _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE我是一个使用共享库的初学者,我真的不知道如何继续下去。下面,我展示了文件,以防有人看到我错过了一些重要的东西。
谢谢。
greet.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);
}makefile
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 $@但仍然有同样的错误。
发布于 2018-06-14 11:22:41
Boost为Python 2和Python 3提供了单独的库。如果使用Python 3,则需要链接到Python 3特定的库,否则在加载模块时会出现未定义的符号错误。
在Ubuntu上,这个库可以称为libboost_python-py35.so。我非常肯定(但没有验证) boost.python库的不同次要版本是向上兼容的,所以您可以在Python3.6中使用libboost_python-py35.so。
如果您的系统中没有这样的库,那么您的发行版很可能不会发布它,在这种情况下,您需要从源代码构建boost.python。
https://stackoverflow.com/questions/50854872
复制相似问题