【问题标题】:Running Python Code in C++ Cmake can't find PyUnicode_FromString在 C++ Cmake 中运行 Python 代码找不到 PyUnicode_FromString
【发布时间】: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


【解决方案1】:

将所需的cmake更改为3.7.2版本,然后清理项目的缓存后,问题得到解决。

【讨论】:

    【解决方案2】:

    您的链接器试图在 libpython.so 中查找 PyUnicode_FromString。它是 Python2,它没有 PyUnicode_FromString(它只有非 unicode PyString_FromString)。

    CMakeLists.txt 示例:

    cmake_minimum_required(VERSION 3.14)
    project(krpc)
    
    set(CMAKE_CXX_STANDARD 11)
    
    
    link_libraries("-lkrpc -lprotobuf -lpthread")
    
    add_executable(krpc test.cpp)
    
    target_link_libraries(krpc python3.7m)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      相关资源
      最近更新 更多