Ошибка при использовании numpy.ctypeslib.load_library

У меня есть вот такая программа 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. Кто-нибудь знает, что происходит?

Заранее спасибо.

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

Distjubo 03.07.2018 23:14

Какая у меня стандартная библиотека?

lucascavalcante 03.07.2018 23:19

Ваша стандартная библиотека - это библиотека, которая предоставляет символы из пространства имен std. Вероятно, это libstdC++, хотя в вашей системе он может быть другим.

Distjubo 03.07.2018 23:20

Однако это не ошибка python, поэтому, пожалуйста, пометьте ее соответствующими флагами (в лучшем случае это связано с python). Это проблема компоновщика

Distjubo 03.07.2018 23:21

Я использую Ubuntu 18.04. Вы имеете в виду, что проблема в линейке using namespace std;?

lucascavalcante 03.07.2018 23:22

Я попытался изменить его на using namespace libstdc++;, но он не работает

lucascavalcante 03.07.2018 23:25

Название стандартной библиотеки правильное. using namespace std; в порядке. Могу я предложить вам сначала прочитать о компиляции / компоновке? См. этот вопрос, я надеюсь, что это прояснит некоторые из ваших затруднений.

Distjubo 03.07.2018 23:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
576
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что здесь все, что нужно сделать, это добавить extern "C" перед int main...

Пусть это поможет кому-нибудь через несколько лет.

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