"分段错误"使用Cmake

时间:2017-01-13 22:40:09

标签: python c++

我正在学习将python代码嵌入到c ++代码中。按照How to solve the 'Segmentation fault' when hybrid programming of C & Python?中的简单示例并使用g++ main.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7编译代码并运行程序,我可以得到正确的结果。

但如果我创建一个" build"文件夹和使用CMake运行程序,它仍然有分段错误。

我的CMakeList.txt如下所示:

cmake_minimum_required(VERSION 2.8)
project ( pyTest )


if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RELEASE")
endif()

string(ASCII 27 Esc)
set(Red "${Esc}[1;31m")
set(ColourReset "${Esc}[m")

if(CMAKE_BUILD_TYPE MATCHES "DEBUG")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -O0 -g")
MESSAGE(STATUS "${Red}BUILD TYPE: DEBUG${ColourReset}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -O3")
MESSAGE(STATUS "${Red}BUILD TYPE: RELEASE${ColourReset}")
endif()


include_directories( include )
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})

set(SRC_LIST2 main.cpp)

add_executable( pytest ${SRC_LIST2})
target_link_libraries(pytest ${PYTHON_LIBRARIES})

为方便起见,我发布了以下代码:

pytest.py

def Hello():
    print "Hello, world!"

的main.cpp

#include <Python.h>

int main()
{

Py_Initialize();
PyRun_SimpleString ("import sys; sys.path.insert(0, 'DIRECTORY_PATH'");
PyObject * pModule = NULL;
PyObject * pFunc   = NULL;

pModule = PyImport_ImportModule("pytest");
pFunc   = PyObject_GetAttrString(pModule, "Hello");
if(pFunc != NULL) {
    PyEval_CallObject(pFunc, NULL);
    Py_Finalize();
}
else {
    printf("pFunc returned NULL\n");
}

return 0;
}

其中&#34; DIRECTORY_PATH&#34;是我的main.cpp文件和pytest.py的文件夹路径,而不是&#34; build&#34;的路径。夹

当我打印出PyImport_ImportModule的结果时,它返回0.我认为这意味着它没有得到python模型。但是我的main.cpp和python文件在同一目录下,我不知道为什么它不能得到模型...

我可以修理吗? THX!

1 个答案:

答案 0 :(得分:1)

由我自己解决。我应该将main.cpp和pytest.py放在同一目录下,并使用PyRun_SimpleString ("import sys; sys.path.insert(0, 'DIRECTORY_PATH'");来更改“DIRCTORY_PATH”#39;保存main.cpp和pytest.py的当前目录。 (在我使用错误的目录之前,我得到了分段错误)