Makefile 使用的命令是:
| %.o : %.cpp g++ -g -lssl -fPIC -levent -lcrypto -luuid -lpthread -lrt -lboost_filesystem -lboost_system -lboost_python -lpython -I/usr/include/python2.7 -o $@ -c $< |
生成B.so的命令是:
| g++ -shared -Wl,-soname,libB.so -o libB.so *.o -lpython -lboost_python |
python脚本中则需要引入该动态库
| import libB print libB.add(10,20) |
按照上面的命令进行编写、编译,就能规避我踩过的坑。注意 -lpython 的位置,不要放在前面。 如果没有实现重载的定义,而是直接使用 def("LOGIN",LOGIN); 则会报如下的错误 error: no matching function for call to ‘def(const char [15], <unresolved overloaded function type>)' def("LOGIN",LOGIN); 综上是我花了一整天时间研究的成果,如有错漏,还请读者指出,谢谢。
补充:当采用boost.python的方式调用c++动态库的时候,我无法处理引用类型,比如 string& recv_answer 用来接收返回结果,被识别为 string{lvalue},而我的python传入的是 string 类型,无法匹配。所以我就手动将 string& recv_answer的string类型的引用,改写成 char * recv_answer_c 格式,就是改成 C 语言的风格,然后用下面的方式传入 recv_answer_c 这个参数用来接收结果。
| #采用 bytes 的方式,为变量预先分配空间,保证不会段错误 temp = bytearray(1000) recv_answer_c= bytes(temp) |
总结:
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易采站长站的支持。








