#python #c #boost #compiler-errors #embedding
#python #c #boost #ошибки компилятора #встраивание
Вопрос:
Я только начинаю изучать cpp, исходя из опыта работы в python и java. Несколько дней назад я решил попробовать и разобраться с внедрением python в cpp с помощью boost. Я установил библиотеку и долгое время пытался заставить ее работать. Однако, что бы я ни делал, я продолжал сталкиваться с ошибкой сегментации. Сначала я просто предположил, что делаю что-то не так с включением библиотеки, но в конце концов я обнаружил, что у меня все еще есть ошибка segfault даже после удаления всего кода, связанного с boost, из моей программы. Я даже преобразовал программу в простой hello world и все равно получил segfault! Вот как выглядит моя программа сейчас:
//#include <boost/python.hpp>
//#include <Python.h>
//using namespace boost::python;
#include <iostream>
using namespace std;
int main() {
//Py_Initialize();
cout << "Test";
}
Я скомпилировал код, используя эти две команды:
gcc -c boost.cpp -o boost.o -fPIC
g boost.o -o boost -shared
и это результат запуска скомпилированной программы:
Segmentation fault
После дальнейшей возни я обнаружил, что если я удалил аргумент -shared:
g boost.o -o boost
Программа будет работать так, как ожидалось. Это было бы хорошо, за исключением того, что для включения библиотеки boost компилятору нужен этот аргумент. Если я попытаюсь раскомментировать #include <boost/python.hpp>
строку в своем коде и перекомпилировать без аргумента -shared , я получаю эту ошибку:
boost.o: In function `boost::python::api::object::object()':
boost.cpp: (.text._ZN5boost6python3api6objectC2Ev[_ZN5boost6python3api6objectC5Ev] 0x14): undefined reference to `_Py_NoneStruct'
collect2: error: ld returned 1 exit status
Я понятия не имею, что происходит. Я делаю это в ubuntu, и я установил boost с помощью этой команды:
sudo apt-get install libboost-all-dev
Я все еще относительно новичок в cpp, поэтому, если я сделал что-то совершенно глупое, не стесняйтесь, дайте мне знать! Заранее спасибо за любую помощь!
Комментарии:
1. если вы все еще получаете ошибку, возможно, у вас могут быть утечки памяти. попробуйте перезагрузить компьютер и повторно запустите свой последний код, чтобы увидеть, исчезнет ли ошибка
2. Одна из очевидных ошибок заключается в том, что вы используете
gcc
код на C . Не делайте этого.
Ответ №1:
Вам не нужно -shared
связываться с библиотеками boost. Вам также необходимо добавить библиотеки python для разрешения неопределенной ссылки _Py_NoneStruct
.
Обратите внимание, что порядок библиотек важен:
g boost.cpp -o boost -lboost_python38 -lpython3.8
Здесь я также добавил boost_mpi_python
библиотеки на случай, если они вам понадобятся:
g boost.cpp -o boost -lboost_mpi_python38 -lboost_mpi -lboost_serialization -lboost_python38 -lpython3.8
Замените 3.8
(и 38
) на фактическую версию, которая у вас есть в вашей системе.