目的:linux系统下特定python版本调用c++,需要安装boost库。python调用c的方式还有python自带的cpython模块,可以直接调用C编译后的.so动态库(或者windows下的.dll)。此处未使用该模块,而是直接使用boost库。
1,注意检查系统是否有boost,如果有,可以查看版本,非编译安装的boost一般会调用默认的python版本。我的linux系统下默认版本是python2.7,需要用的python为3.6。则先将以前boost版本卸载,查看boost版本。
dpkg -S /usr/include/boost/version.hpp
卸载对应版本,**表示版本号。
sudo apt-get autoremove libboost**-dev
boost官网,下载最新版本boost,如我的boost在opt下并进入安装文件夹,找到user_config.jam文件,编辑加入using mpi,保存。
2,采用root用户,进入安装包目录下。
sudo -i
cd /opt/boost_1_66_0
3,找到python的安装位置,一般在usr/bin/下,对应要安装的版本。--prefix表示boost安装的路径,可指定该路径。
./bootstrap.sh --prefix=/usr/local/boost --with-libraries=all --with-python=/usr/bin/python3.6m
运行bootstrap.sh完成后,有系统界面会提示需要进入project_config.jam界面加入python的相关路径,可以加入python的路径
vim project-config.jam
在project-config.jam中python对应的地方加入指定版本的python的include和lib。
using python : 3.6 : /usr/bin/python3.6m : /usr/include/python3.6m : /usr/lib/python3.6 ;
4,编译及指定python版本安装,并用--prefix指定boost安装位置。
./b2
./b2 install --with-python include="/usr/include/python3.6m"
5,安装完成后,更新,添加boost路径,在profile添加。
vim /etc/profile #添加安装boost的路径
6,运行环境
source /etc/profile
7,更新连接库
ldconfig #更新动态连接库
以上安装完成。注意:安装完成后,要重启一下linux,否则容易出现各种编译不成功的问题。
查看/usr/lib/x86_64-linux-gnu下是否有boost安装路径中的lib文件夹下的libboost_system.so和libboost_python3.so之类的关联文件,如果没有,则可以直接copy到对应文件夹下。
测试boost。
1)运用网络找到的heloworld.cpp文件,测试有效。cpp文件如下
#include
#include
#include // 必须引入这个头文件
using namespace boost::python;
class HelloWorld{
public:
HelloWorld(const std::string& name, int age);
void printInfo();
private:
std::string m_name;
int m_age;
};
HelloWorld::HelloWorld(const std::string& name, int age):m_name(name), m_age(age){
}
void HelloWorld::printInfo(){
std::cout << "我叫" << m_name << ", " << m_age << "岁了" << std::endl;
}
void ceshi(){
std::cout << "ceshi" << std::endl;
}
BOOST_PYTHON_MODULE(helloworld){
// 类导出成Python可调用的动态链接库文件的方式
class_
("helloworld", init ())//导出类中的方法
.def("printinfo", &HelloWorld::printInfo);
// 普通函数导出成Python可调用的动态链接库文件的方式
def("ceshi",&ceshi);
}
2)编译生成.so文件。也可以在jupyter-lab下编写makefile文件,输入下列语句,然后执行!make。则可以在文件夹下看到对应的.so文件。
g++ helloworld.cpp -fPIC -shared -o helloworld.so -I. -I/usr/include/python3.6m -I/usr/local/include/boost -L/usr/local/lib -lboost_python3
3)终端进入python3.6。如果是在jupyter-lab里,则可以省略此步骤。
python3.6
4),可以直接调用编译的helloworld.so文件。如果在jupyter-lab中,则可以直接输入,最终可以在终端看到输出。
import helloworld
hw = helloworld.helloworld("lanyulei", 18)
hw.printinfo()