g++ -shared 参数似乎导致了分段错误

g++ -shared argument seems to be causing a segmentation fault

我刚刚开始学习 cpp,来自 python 和 java 的背景。几天前,我决定尝试使用 boost 将 python 嵌入到 cpp 中。我安装了库,并尝试了很长时间才能使其正常工作。但是,无论我做了什么,我都会 运行ning 陷入分段错误。起初我只是假设我在包含库时做错了什么,但最终,我发现即使从我的程序中删除了所有与 boost 相关的代码后,我仍然遇到了段错误。我什至将程序转换为一个简单的 hello world,但仍然出现段错误!这是我的程序现在的样子:

//#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 还是比较陌生,所以如果我做了一些完全愚蠢的事情,请随时告诉我!在此先感谢您的帮助!

您不需要 -shared 到 link 的提升库。您还需要添加 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)替换为您系统上的实际版本。