栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Swig简单实验和理解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Swig简单实验和理解

一 问题起源

在看tensorflow的源码的时候,发现python调用c++框架是如何实现的引起了我的好奇,发现编译的时候使用的是Swig

操作环境

为了搞清楚swig使用方法,简单做了一个实验验证Swig; Swig是一个独立库可以让用户使用python调用c++程序;

环境问题

tensorflow本身在编译依赖的时候都是直接下载对应的库放在一个临时编译目录

比如我的编译路径如下,注意红色的部分每个工程编译都是一个独立的目录,其实tensorflow这样搞也有好处,多个工程之间不耦合;但是对我们验证Swig程序会有影响,因为不在标准的lib库下

/root/.cache/bazel/_bazel_root/014e8ed0b29435778e37e53e83f1c80c/execroot/org_tensorflow/bazel-out/k8-opt/bin/tensorflow/python/tools/inspect_checkpoint.runfiles/org_tensorflow/tensorflow/python/pywrap_tensorflow_internal.py

解决办法: 只是做测试,所以干脆暴力单独拷贝swig库测试

创建独立测试目录 /home/test_swig;拷贝可执行程序swig到上面的/home/test_swig目录,执行过程中可能会报错,直接去tensorflow路径下找对应的文件就可以了,肯定能找到的,找到后拷贝到一起的样子如下:

 

二 编写测试程序   1. 比如我们写一个example.c的文件

double  My_variable  = 3.0;


int fact(int n) {
  if (n <= 1)
    return 1;
  else
    return n*fact(n-1);
}


int my_mod(int n, int m) {
  return(n % m);
}

2. 导出文件写一个example.i
%module example
%{

extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);
%}
 
extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);

3.  编译执行

$swig -python example.i
$gcc -c -fpic example.c example_wrap.c -I/usr/local/python36/include/python3.6m/
$gcc -shared example.o example_wrap.o -o _example.so
$python    
>>> import example
>>> example.fact(4)

最后生成出的文件

so _example.so

example_wrap.c

example.py

 4.  分析讨论(验证玩一下)

  (1)对比tensorlfow导出的/pywrap_tensorflow_internal.cc 和example_wrap.c发现基本一样都是3000行代码,而别地方不同;原因大家自己分析吧,我还在研究

(2)查看example.py中的代码 是在加载_example.so ;其他没啥逻辑

     使用打印日志的方式可以显示出加载的路径  

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691449.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号