python 調用 so 庫 須要注意的地方

     使用C++而不是C來編寫so庫時每每會遇到一些問題,這裏着重探討一下linux環境下C++編寫so庫python

及python調用so庫須要注意的地方。linux

test.ccios

#include<iostream>
extern "C"{  // 重要,由於使用g++編譯時函數名會改變,比方print_msg(const char*)
						 // 會編譯成函數名 print_msg_char,這會致使python調用這個函數的時候
						 // 找不到對應的函數名,這有加了 extern "C",纔會以C語言的方式進行
						 // 編譯,這樣不會改變函數名字
	void print_msg(const char* s)
	{
	   std::cout<<s<<std::endl;
	}
	
	int add_Integer(int a,int b)
	{
		return a+b;
	}
}

編譯命令:函數

g++ -shared test.cc -o test.so -fPICcode

-fPIC 的參數不能丟,PIC(Position Independent Code)表示生成代碼與位置無關,這樣才能ip

達到動態連接的目的。utf-8

script.pyget

#! /usr/bin/env/python
# _*_ encoding : utf-8 _*_

from ctypes import *
 
import os

sotest = cdll.LoadLibrary(os.getcwd()+ "/test.so")

	sotest.print_msg("hello,my shared object used by python!")
 
	print("4+5=%s" %sotest.add_Integer(4,5))
相關文章
相關標籤/搜索