python - 在 C++ Cmake 中运行 Python 代码找不到 PyUnicode_FromString

标签 python c++ linux cmake clion

我正在尝试在 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。我似乎找不到我要找的东西。

最佳答案

您的链接器试图在 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)

关于python - 在 C++ Cmake 中运行 Python 代码找不到 PyUnicode_FromString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57517783/

相关文章:

python - 如何避免使用全局变量?

Python:显示类型继承

Python 2D Numpy Array 到 1D(有点..)

c++ - 什么是 C++ 中的 std::invoke?

linux - 使用 xrandr 缩放克隆

python - 如何在 DataFrame 上执行 concat 时分配默认值

c++ - C++ 中的对象初始化和对象工厂

c++ - 基于类型的任意属性的函数重载不起作用

c - sysconf(_SC_CLK_TCK) 与 CLOCKS_PER_SEC

Python:如何测试我的包是否在 Linux、Mac 和 Windows 上运行