最近一直在用C/C++做开发,虽然C/C++都有自己的单元测试框架(CUnit,CPPUnit,知道还有其它框架的兄弟告诉我一声,我去看看),但是总觉得写起来麻烦(人懒没办法),于是萌发了寻找更简便方法的念头。
听说Python, Perl, Tcl都可以调用C的动态链接库,但必须把它们做成这些脚本语言的扩展模块,这样一来,复杂度又变高了,工作量也大。
后来花了一个下午的时间在往上找,终于在一个论坛上发现一个叫SWIG的东西,它将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等)。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrap.c为后缀的包装文件,例如你的C模块叫 test.c, 那么SWIG会为你生成一个test_wrap.c文件,然后将这两个文件编译成一个动态链接库,就能使用其它的脚本语言来调用。下面是个简单的例子
tt.h
#ifdef _WIN32
int __declspec(dllexport)getvalue();
#else
int getvalue();
#endif
tt.c
#include "tt.h"
int getvalue()
{
return 100;
}
下面使用swig和gcc来生成Python模块
环境:mingw32 + msys
swig -python -module tt tt.h
gcc -c tt.c tt_wrap.c -I/usr/local/python25/include
gcc -shared tt.o tt_wrap.o -o tt.dll -L/usr/local/python25/libs -lpython25
tt_test_win.py:
from ctypes import *
tt = CDLL("tt.dll")
print tt.getvalue()
环境:debian
swig -python -module tt tt.h
gcc -c tt.c tt_wrap.c -I/usr/local/include/python2.5
gcc -shared tt.o tt_wrap.o -o tt.so -L/usr/local/lib/python2.5 -lpython2.5
tt_test_linux.py:
from ctypes import *
tt = CDLL("./tt.so")
print tt.getvalue()
在以上两个不同的环境下除了一些include和lib的路径不同以及动态连接库的扩展名不同外,代码基本都差不多。这样swig就将从C映射到Python等脚本语言的工作完成了,我接下来所做的就是使用Python来测试我用C所写的程序。我想这样应该可以大大减少我写测试代码的时间了。
分享到:
相关推荐
对开发人员的一个常见要求是向脚本语言接口公开 C/C++ 代码,这正是 Simplified Wrapper and Interface Generator (SWIG) 的用武之地。SWIG 允许您向广泛的脚本语言公开 C/C++ 代码,包括 Ruby、Perl、Tcl 和 Python...
swig工具,C/C++到python, tcl 的接口
Python & C++ Comparisons Python C API SWIG
SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。
swig 打包C/C++程序;供python调用。 本软件操作平台windows 10 Vs2017;python3.8; 主要讲述swig vs配置,测试用例。 主要包含常量,变量,指针,结构体定义及运用。
In a nutshell, SWIG is a compiler that takes C/C++ declarations and creates the wrappers needed to access those declarations from other languages including including Perl, Python, Tcl, Ruby, Guile, ...
cmake_c++_python_swig
https://sourceforge.net/projects/swig/files/swig/swig-4.2.0/
故而将C库作为Python库的扩展极为必要,使得Python既融合了自身的优点,又融合了C语言的优点,正是因为这些性质使得Python越来越流行。 二、通过swing扩展C库 (1) 安装swig 命令: sudo apt-get install swig (2) ...
用swig实现在python中使用c++的函数和类的很少的介绍的文章
JavaCPP 提供了对 Java 内部本机 C++ 的高效访问,这与某些 C/C++ 编译器与汇编语言交互的方式没有什么不同。无需发明新语言,例如SWIG、SIP、C++/CLI、Cython或RPython。相反,与cppyy为 Python 所做的事情类似,它...
利用C和C++可以对它进行扩充。个别的应用软件如果需要有一个可程序化界面也可以利用它来做为扩展语言用。最后,Python的可移植度非常高:它可以在许多的Unix类平台上运行,在Mac,MS-DOS,视窗Windows,Windows NT,OS/...
python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单,现在我们就简单记下Pybind11的入门操作。 1. pybind11简介与环境...
通过使用 SWIG,可与 Python、Java 等语言进行集成(当然可以单独使用C++)。 使用此框架可以快速开发出更多的插件和应用软件,此框架已在 Windows/Linux/MacOSX 上测试过。 要在 Windows 上编译和运行,请参考 ...
使用 SWIG 将 C++ 库移植到 Go 例外此代码旨在作为如何移植抛出异常的 C++ 库的示例。 所有抛出异常的方法都包含在 try/catch 块中,这些块将异常转换为恐慌,然后恢复以返回 go 错误。描述DemoLib C++ 类DemoLib ...
将swig的路径添加到环境变量Path,例如set path=C:swigwin-3.0.2。 3.用VS创建一个win32 console application名为MyApp并生成解决方案,编译生成MyApp.exe。 4.在MyApp解决方案里面新建一个win32 dll带...
显示使用 SWIG 为 Java、Python 和 C# 生成包装器的示例。 结构: SwigExample.sln - Visual Studio 2013 解决方案 CSharpTest - 显示使用生成的 C# 包装器的 Visual Studio 单元测试代码 JavaTest - JUnit 单元...
借助于拥有基于标准库的大量工具、能够使用低级语言如C和可以作为其他库接口的C++,Python已成为一种强大的应用于其他语言与工具之间的胶水语言。 Python标准库的主要功能有: 文本处理,包含文本格式化、正则表达式...
SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is used with different types of target languages including ...
这将构建 C++ 测试二进制文件,为outer.h和inner.h生成 SWIG 绑定,并使用 Python 包装器构建共享库。 运行它 测试显示了所有不同的场景: # Run a simple test of the pure-C++ code ./test # Run a simple test ...