LINUX.ORG.RU

Модуль на Си для Питона -> собрать для Си++


0

1

Написал простенький модуль-шаблон:

/* Test Python module for ncurses-interface. */

#include <Python.h>
#include <stdio.h>   // printf
#include <string.h>
#include <curses.h>
#include <unistd.h>
#include <locale.h>

#define VAR(a) simplecurses_##a

WINDOW *window;

static PyObject *VAR(output)(PyObject *self, PyObject *args) {
  const unsigned char *s;
  int i;
  PyArg_ParseTuple(args, "es", "UTF-8", &s);
  setlocale(LC_ALL,"ru_RU.UTF-8");
  window = initscr();
  wprintw(window,(const char *)s);
  waddwstr(window,L"Привет");
  wrefresh(window);
  sleep(1);
  endwin();
  return Py_None;
}

static PyMethodDef VAR(methods)[] = {
  {"output", VAR(output), METH_VARARGS, "output()"},
  {NULL, NULL}
};

DL_EXPORT()

int initsimplecurses () {
  Py_InitModule("simplecurses", VAR(methods));
}
#!/usr/bin/python
# -*- coding: utf-8 -*-

import simplecurses as sc

sc.output(unicode("Тест","UTF-8"))
#!/bin/bash
NAME=simplecurses
gcc -fPIC -finput-charset=utf-8 -I/usr/include/python2.6 -I/usr/include/ncursesw -c -o $NAME.o $NAME.c
gcc -o $NAME.so $NAME.o -shared -lncursesw
Всё работает.
Как собрать подобное же для Си++? Если просто заменить gcc на g++, выдается:
$ ./test.py 
Traceback (most recent call last):
  File "./test.py", line 4, in <module>
    import simplecurses as sc
ImportError: dynamic module does not define init function (initsimplecurses)

Использовать SWIG, sip4?

★★★★★

extern «C» int initsimplecurses (void);

int initsimplecurses (void) { Py_InitModule(«simplecurses», VAR(methods)); }

anonymous
()

И не забываем, что в Си int x() === int x(...) а в си++ int x() === int x(void)

mmarkk
()
Ответ на: комментарий от anonymous

> extern «C» int initsimplecurses (void);

Спасибо. Заработало. nm, кстати, до этого выдавал функцию ...initsimplecursesv (с буквой «v» на конце).

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.