我编写了一个简单的代码,试图在C ++中使用numpy。
我的操作系统是ubuntu16.04
,带有gcc5.4.0
,Python2.7.12
和numpy1.15.0
。
这是我的代码test2.cpp
:
#include "Python.h"
#include "numpy/arrayobject.h"
int main(int argc, char **argv)
{
Py_Initialize();
import_array();
Py_Finalize();
return 0;
}
我这样使用CMakeLists.txt
:
cmake_minimum_required(VERSION 3.10)
project(test_python LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE DEBUG)
set(PYTHON_INCLUDE_PATH /usr/include/python2.7)
set(PYTHON_LIBRARY /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so)
set(NUMPY_INCLUDE_PATH /usr/local/lib/python2.7/dist-packages/numpy/core/include)
include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${NUMPY_INCLUDE_PATH})
add_executable(test_python test2.cpp)
target_link_libraries(test_python
${PYTHON_LIBRARY}
)
但是当我做到这一点时,我遇到了以下编译错误:
/usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/__multiarray_api.h:1547:144: error: return-statement with no value, in function returning ‘int’ [-fpermissive]
#define import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return NUMPY_IMPORT_ARRAY_RETVAL; } }
^
/home/camsys/projects/hmr_c/test/test2.cpp:7:5: note: in expansion of macro ‘import_array’
import_array();
^
这很奇怪,因为当我将Python3.5
与Numpy1.15.0
一起使用时,一切正常。 有人可以告诉我为什么会发生此错误以及如何解决该问题吗?
我发现了4年前问的另一个类似问题,没有答案Passing C++ array to python。这个问题是关于python3.4
,而我正在处理python2.7
。
答案 0 :(得分:0)
import_array()
是在/usr/local/lib/pythonX.Y/dist-packages/numpy/core/include/numpy/__multiarray_api.h
内部定义的宏。在代码预处理期间(在编译之前),该宏的定义被扩展并替换为main
函数,如下所示:
int main(int argc, char **argv)
{
Py_Initialize();
{
if (_import_array() < 0) {
PyErr_Print();
PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import");
return NUMPY_IMPORT_ARRAY_RETVAL;
}
}
Py_Finalize();
return 0;
}
现在,NUMPY_IMPORT_ARRAY_RETVAL
也是在同一文件__multiarray_api.h
中定义的宏。对于python3及更高版本,此宏定义为NULL
,否则为空。
#if PY_VERSION_HEX >= 0x03000000
#define NUMPY_IMPORT_ARRAY_RETVAL NULL
#else
#define NUMPY_IMPORT_ARRAY_RETVAL
#endif
应该使用int main
函数返回一个整数,但是在扩展的if statement
内(如果满足条件_import_array() < 0
),对于Python版本,它将返回NULL = 0 (#define NULL 0)
或> = 3,因此有效。对于<3的python版本,main
函数不返回任何内容,因此会出错。
解决方法(对于python版本<3):
void temp_func() {
import_array();
}
int main(int argc, char **argv) {
Py_Initialize();
temp_func();
Py_Finalize();
return 0;
}
希望,这可以回答问题。