Упаковка кода 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).