【发布时间】:2019-12-22 08:58:21
【问题描述】:
我正在尝试在 c++ 中运行 python 代码
#include <python3.7/Python.h>
// PYTHON START
Py_Initialize();
PyObject *module_name = PyUnicode_FromString("plotter");
PyObject *module = PyImport_Import(module_name);
Py_DECREF(module_name);
if (module != nullptr) {
PyObject *py_function = PyObject_GetAttrString(module, "plot_data");
//call the python and pass the data generated in C
//------------------------------------------------------------------------------------------------------
if (py_function && PyCallable_Check(py_function)) {
pid_t pid = fork();
if (pid == 0) {
PyObject *res = PyObject_CallFunctionObjArgs(py_function, q);
}
}
}
我以前从未这样做过,但我认为这不是问题,因为我无法构建代码。 我的错误是:
/snap/clion/81/bin/cmake/linux/bin/cmake --build /home/alex/Workspace/Clion/krpc/cmake-build-debug --target krpc -- -j 2
[ 50%] Linking CXX executable krpc
/usr/bin/ld: CMakeFiles/krpc.dir/test.cpp.o: in function `main':
/home/alex/Workspace/Clion/krpc/test.cpp:43: undefined reference to `PyUnicode_FromString'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/krpc.dir/build.make:85: krpc] Error 1
make[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/krpc.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/krpc.dir/rule] Error 2
make: *** [Makefile:118: krpc] Error 2
我的 cmake 文件如下所示:
cmake_minimum_required(VERSION 3.14)
project(krpc)
set(CMAKE_CXX_STANDARD 11)
link_libraries("-lkrpc -lprotobuf -lpthread")
find_package(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS})
add_executable(krpc test.cpp)
target_link_libraries(krpc ${PYTHON_LIBRARIES})
编辑:我的 cmake 输出如下所示:
/snap/clion/81/bin/cmake/linux/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /home/alex/Workspace/Clion/krpc
-- PYTHON_LIBRARIES: /usr/lib/x86_64-linux-gnu/libpython2.7.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/alex/Workspace/Clion/krpc/cmake-build-debug
[Finished]
我在 cmake 中查看了 find_packages(),如果我只有普通的 python,它会找到 python2.7,但我想要 3.7。我似乎找不到我要找的东西。
【问题讨论】:
-
CMake 运行时的输出是什么?请将输出添加到您的问题帖子中。您能否在调用
target_link_libraries之前添加message(STATUS "PYTHON_LIBRARIES: ${PYTHON_LIBRARIES}")以查看是否正确找到了Python 库? -
我添加了它,看起来它仍然只是找到 libpython2.7,当我将 pythonlibs 更改为 pythonlibs3 但是它吐出错误说它找不到 python3,我不太了解 cmake虽然配置它
-
您是否已将 Python3 库的路径添加到
PATH环境变量中?考虑从PATH中删除 Python 2 库的路径。 -
您可能会将您的
find_package调用更改为find_package(PythonLibs 3 REQUIRED)以告诉 CMake 仅查找 Python 3,如果未找到则失败。 -
使用 find_package(PythonLibs 3 REQUIRED) 会引发错误。当我回到我的电脑时,我必须仔细检查我的 PATH。当 cmake 无法找到 python3 时,pythonlibs 3 上的错误是一致的。我只是不知道如何让它看到它。我会尝试 PATH 但还有其他方法吗?
标签: python c++ linux cmake clion