Olej писал(а):
- использование пакета
swig (это ссылка на его документацию)... этот пакет есть в репозитарии практически каждого дистрибутива Linux, так что его и собирать его не надо...
SWIG, как мне кажется, это самый универсальный интерфейс, но одновременно и самый капризный в использовании.
Универсальность определяется тем, что (см.
сайт проекта) :
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 common scripting languages such as Perl, PHP, Python, Tcl and Ruby. The list of supported languages also includes non-scripting languages such as C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), D, Go language, Java including Android, Lua, Modula-3, OCAML, Octave and R.
... интерфейс к добрым 2-м десяткам языков программирования.
Но за универсальность всегда нужно платить сложностью!
Проект активно развивается:
Recent News
2013/0
5/27 - SWIG-2.0.10 released
Идея SWIG в том, что кроме реализации файла модуля (.c) на C (или C++ - .cc), нужно:
- всего лишь записать интерфейсный файл (.i) на специальном макроязыке SWIG
- SWIG сгенерирует интерфейсные файлы...
- язык, для которого генерируется, указывается параметром команды SWIG, а интерфейсный файл (.i) не зависит от того, в какой язык (Python, LISP, Modula-3 etc.) из него будут генерить интерфейс ... это даже удивляет
Вот, для примера, простейший пример (first.tgz), каталог до генерации:
Код: Выделить всё
bash-4.2$ ls
first.hist Makefile make_py.sh ownmod.c ownmod.i test.py
К делу здесь относятся только 2 файла (Makefile & make_py.sh - это скрипты сборки, test.py - тестовая программа на Python которой будем проверять что получится), это:
- файл C кода реализующего новый модуль - ownmod.c:
Код: Выделить всё
#include <stdio.h>
void echo( void ) {
printf( "вывод из экспортированного кода!\n" );
}
- файл описания интерфейса к этому модулю - ownmod.i:
Всё!
В таком простейшем случае всё просто до примитивного!
Вся генерация (в Makefile или скрипте make_py.sh):
Код: Выделить всё
bash-4.2$ make
swig -python -module ownmod ownmod.i
gcc -c -fpic ownmod_wrap.c ownmod.c -DHAVE_CONFIG_H -I/usr/include/python2.7 -I/usr/include/python2.7
gcc -shared ownmod.o ownmod_wrap.o -o _ownmod.so
rm *.o
После чего создаётся динамическая библиотека (DLL) _ownmod.so (
обратите внимание на подчёркивание!), и мы можем из Python-теста тестировать модуль ... файл test.py :
Код: Выделить всё
#!/usr/bin/python
# -*- coding: utf-8 -*-
import ownmod
ownmod.echo()
Выполнение:
Код: Выделить всё
bash-4.2$ ./test.py
вывод из экспортированного кода!
Вот так вот всё просто!