Exportando C ou C++ para qualquer linguagem de script automaticamente

PHPC / C++JavaPerlPython
Enviado por thotypous em Sáb, 19/08/2006 - 11:35.PHP | C / C++ | Java | Perl | Python

Esses dias estou trabalhando em uma biblioteca cross-platform de captura de vídeo em C++, e pensei em aproveitar a situação para continuar um projeto que eu tinha, o ruby-v4l. Então lembrei de um software que eu tinha ouvido falar, o SWIG, e resolvi fazer uns testes com ele. Ele é capaz de exportar automaticamente um código em C ou C++ para uso em diversas linguagens de script: PHP, Ruby, Python, Perl, Java, e diversas outras. Se a linguagem de destino permitir, ele exporta até mesmo operator overloading e outros recursos de C++.

Darei aqui um exemplo simples de uso do utilitário SWIG para exportar uma classe em C++ para o Python.

Primeiramente, vamos ao código em C++.

  1. // teste.h
  2.  
  3. class vector {
  4.  
  5. public:
  6.    
  7.     double x, y;
  8.    
  9.     vector(double = 0, double = 0);
  10.    
  11.     vector operator + (vector);
  12.     vector operator - (vector);
  13.     vector operator - ();
  14.     vector operator * (double);
  15.  
  16.     double module();
  17.    
  18. };
  19.  

  1. // teste.cpp
  2.  
  3. using namespace std;
  4.  
  5. #include <cmath>
  6.  
  7. #include "teste.h"
  8.  
  9. vector::vector (double a, double b) {
  10.     x = a;
  11.     y = b;
  12. }
  13.  
  14. vector vector::operator + (vector a) {
  15.     return vector(x + a.x, y + a.y);
  16. }
  17.  
  18. vector vector::operator - (vector a) {
  19.     return vector(x - a.x, y - a.y);
  20. }
  21.  
  22. vector vector::operator - () {
  23.     return vector(-x, -y);
  24. }
  25.  
  26. vector vector::operator * (double a) {
  27.     return vector(x * a, y * a);
  28. }
  29.  
  30. double vector::module() {
  31.     return sqrt(x*x + y*y);
  32. }
  33.  

Agora vamos criar um arquivo de instruções de exportação para o SWIG. Esse arquivo é mais ou menos no mesmo formato de um header C ou C++, com os protótipos das funções e classes que você queira exportar para a linguagem de destino.

  1. // teste.i
  2.  
  3. %module teste
  4. %{
  5. #include "teste.h"
  6. %}
  7.  
  8. class vector {
  9.  
  10. public:
  11.  
  12.     double x, y;
  13.  
  14.     vector(double = 0, double = 0);
  15.  
  16.     vector operator + (vector);
  17.     vector operator - (vector);
  18.     vector operator - ();
  19.     vector operator * (double);
  20.  
  21.     double module();
  22.  
  23. };
  24.  

Agora é só rodar o SWIG para criar o wrapper para a linguagem de destino, no caso, Python:

    $ swig -c++ -python teste.i $ g++ -c -fpic teste.cpp teste_wrap.cxx -I /usr/include/python2.4 $ g++ -shared teste.o teste_wrap.o -o _teste.so

Agora teremos dois arquivos, teste.py, que é a interface de alto nível, e _teste.so, que é o wrapper com a interface de baixo nível. Podemos agora utilizar nosso código em C++ a partir do Python:

  1.  
  2. In [1]: import teste
  3. In [2]: u = teste.vector(3,4)
  4. In [3]: v = teste.vector(4,3)
  5. In [4]: u.module()
  6. Out[4]: 5.0
  7. In [5]: v.module()
  8. Out[5]: 5.0
  9. In [6]: (u+v).module()
  10. Out[6]: 9.8994949366116654
  11. In [7]: (u-v).module()
  12. Out[7]: 1.4142135623730951
  13. In [8]: teste.vector(-1).module()
  14. Out[8]: 1.0
  15. In [9]: a = 2 * u
  16. In [10]: (a.x, a.y)
  17. Out[10]: (6.0, 8.0)
  18. In [11]: a
  19.  



Enviado por Bruno (não verificado(a)) em Ter, 11/12/2007 - 23:33.

Cara, muito bom esse seu exemplo e explicação.

Foi muito útil pra mim.

Continue Postando aqui no site.

Bruno Estevao
www.sempihost.com.br