Упаковка кода C++ для Python с использованием SWIG. Не могу использовать команду cout

Я пытаюсь обернуть для Python этот простой код C++, используя SWIG:

#include "hello.h"

int helloW() 
{
    std::cout << "Hello, World!" ;
    return 0;
}

а вот относительный заголовок:

#include <iostream>
int helloW() ; // decl

В качестве входного файла SWIG я использую:

/* file : pyhello.i */

/* name of module to use*/
%module pyhello
%{
    #include "hello.h"
%}    
%include "hello.h";

Теперь мой make-файл (который работает нормально):

all:
    swig -c++ -python -Wall pyhello.i 
    gcc -c -fpic pyhello_wrap.cxx hello.cpp -I/usr/include/python2.7
    gcc -shared hello.o pyhello_wrap.o -o _pyhello.so

как я смог собрать из разных источников относительно проблемы онлайн. Теперь, когда я пытаюсь импортировать в python мою библиотеку, как это делается с помощью команды

>>> import pyhello

Это ошибка, которую я получаю:

    Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pyhello.py", line 17, in <module>
    _pyhello = swig_import_helper()
  File "pyhello.py", line 16, in swig_import_helper
    return importlib.import_module('_pyhello')
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: ./_pyhello.so: undefined symbol: _ZSt4cout

Что заставляет меня думать, что эта проблема связана с командой std::cout или вообще в стандартную библиотеку <iostream>,

Надеюсь, кто-нибудь может дать мне несколько советов по этой проблеме. Большое спасибо заранее!!

ПРИМЕЧАНИЕ: такая же проблема возникает при попытке использовать команду printf() вместо std::cout и библиотека <cstdio> вместо <iostream>

1 ответ

Решение

ImportError: ./_pyhello.so: неопределенный символ: _ZSt4cout

с c++filt _ZSt4cout вы узнаете, что это std::cout ( название калечит).

Вы должны использовать g++не gcc, особенно в вашей команде компоновщика (с -shared).

Или вам нужно явно связать с некоторыми -lstdc++ ваша общая библиотека.

Прочтите Drepper's Как писать общие библиотеки (поскольку Python использует dlopen (3)-ing, а затем dlsym (3)-ing).

Вам лучше объявить как extern "C" int helloW(void); Ваша рутина (читайте C++ dlopen minihowto).

Другие вопросы по тегам