g -общий аргумент, похоже, вызывает ошибку сегментации

#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 ) на фактическую версию, которая у вас есть в вашей системе.