Cygwin, C, Python, SWIG, Wrappers & Sofrimento em Win32

Existem muitos tipos de sofrimento, e a disciplina do “Projetão” desse período está me trazendo uma grande variedade deles. Contudo, vou falar apenas do sofrimento de ser obrigado a ficar próximo do que é desagradável. Esse está representado pelo uso do Windows como S.O., já que o tablet PC que conseguimos pro projeto, assim como o cérebro de muitos professores desse centro, roda Windows.

Mas onde existe sofrimento, existe algum paleativo! O projeto usa as linguagens Python e C, e minha parte foi fazer a integração das duas, no sentido de Python chamando funções em C. Primeiro precisei exorcisar o ambiente: instalei o Cygwin, que me dá o direito de usar GCC, Make e um terminal bash perfeitamente funcional. Quando apertava CTRL+R pensava estar no gnome-terminal.

Pra tarefa de criar os wrappers Python sobre a lib em C usei o SWIG. É bem simples: você cria um arquivo.i, roda o SWIG que por sua vez gera um arquivo_wrap.c mais um arquivo.py (e várias outras linguagens), depois disso um Makefile pra criar as DLLs, aí você pode importar e aproveitar a alta performance de uma função em C. Meu problema é que compilava as DLLs e wrappers no Cygwin e quando o povo usava com o Python instalado no windows, ele pedia a libpython2.4.dll, e depois de copiada do /bin do Cygwin para o diretório onde seria usada, eu descobri que ela estava linkada com o cygwin1.dll, quando coloquei mais esse a aplicação travava para sempre e sempre.

Me informando melhor descobri que compilar coisas no Cygwin faz seu código precisar do runtime do bicho, que a princípio não é nada mal, já que ele emula umas posix-coisas legais. Mas estava sem saco pra ver descobrir qual o problema, possivelmente não relacionado com o Cygwin, além disso não tinha mais castanhas-do-pará então resolvi matar o cyg, ou melhor, suas DLLs. Descobri a diretiva do gcc -mno-cygwin, que evita o uso das dlls do cygwin, mas também nada mais estava compilando. Resolvido algumas horas depois, quando troquei o endereço dos includes e libs de Python, tirando os do cygwin (que estavam linkados com o cygwin1.dll) e colocando os da instalação de Python no Windows, em c:\Temp\Python24.

PYTHON_LIB_PATH = /cygdrive/c/Temp/Python24/libs
PYTHON_INC_PATH = /cygdrive/c/Temp/Python24/include

E a compilação de um dos DLLs ficou mais ou menos assim

gcc -c blah.c -mno-cygwin
gcc -c -I$(PYTHON_INC_PATH) blah_wrap.c -mno-cygwin
gcc -L$(PYTHON_LIB_PATH) -shared -mno-cygwin $(OBJS) -lpython24 -o _blah.dll

Referência:

2 pensamentos sobre “Cygwin, C, Python, SWIG, Wrappers & Sofrimento em Win32

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s