У меня есть вот такая программа prog.cpp:
#include <iostream>
using namespace std;
int main(int argc, char** argv){
printf("hello world\n");
return 0;
}
И у меня есть эта программа prog.py, которая должна загружать main в функцию python:
import subprocess
import numpy.ctypeslib as npct
subprocess.call(['gcc', '-Wall','-c', '-fPIC', 'prog.cpp', '-o', 'prog.o'])
subprocess.call(['gcc', 'prog.o', '-shared', '-o', 'lib_prog.so'])
lib = npct.load_library('lib_prog', '.')
fun = getattr(lib,'main')
fun()
Но я получаю следующую ошибку:
Traceback (most recent call last):
File "prog.py", line 7, in <module>
lib = npct.load_library('lib_prog', '.')
(...)
OSError: /my_dir/lib_prog.so: undefined symbol: _ZSt4cout
Моя программа кажется идентичной любому примеру использования numpy.ctypeslib.load_library. Кто-нибудь знает, что происходит?
Заранее спасибо.
Какая у меня стандартная библиотека?
Ваша стандартная библиотека - это библиотека, которая предоставляет символы из пространства имен std. Вероятно, это libstdC++, хотя в вашей системе он может быть другим.
Однако это не ошибка python, поэтому, пожалуйста, пометьте ее соответствующими флагами (в лучшем случае это связано с python). Это проблема компоновщика
Я использую Ubuntu 18.04. Вы имеете в виду, что проблема в линейке using namespace std;?
Я попытался изменить его на using namespace libstdc++;, но он не работает
Название стандартной библиотеки правильное. using namespace std; в порядке. Могу я предложить вам сначала прочитать о компиляции / компоновке? См. этот вопрос, я надеюсь, что это прояснит некоторые из ваших затруднений.






Я обнаружил, что здесь все, что нужно сделать, это добавить extern "C" перед int main...
Пусть это поможет кому-нибудь через несколько лет.
Это ошибка компоновщика. Сначала вам нужно загрузить стандартную библиотеку. (Или вы можете объявить это как зависимость, используя -lstdC++ в командной строке компоновщика)