微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 CMake 指向 conda env 中正确的 Python 头文件?

如何解决将 CMake 指向 conda env 中正确的 Python 头文件?

我正在尝试在 C++ 中嵌入 Python 代码并在 Conda 环境中使用这些包。我有

// main.cpp
#include <Python.h>

int main(int argc,char *argv[]) {
    Py_Initialize();
    return 0;
}

在 CMakeLists.txt 中我添加了:

find_package(python3 COMPONENTS Interpreter Development)

我在 Conda 环境(称为 venv)处于活动状态的情况下运行 cmake。当我尝试编译时,我得到:

/home/myself/.conda/envs/venv/bin/python3.7 (found version "3.7.7") found components:  Interpreter Development

但是当我运行 make 时,我得到:Fatal error: Python.h: No such file or directory。所以我做了一个 locate Python.h 并找到了几个 Python.h 文件

/home/myself/.conda/envs/venv/include/python3.7m/Python.h
/home/myself/.conda/envs/venv/lib/python3.7/site-packages/tensorflow/include/external/local_config_python/python_include/Python.h
/home/myself/.conda/pkgs/python-3.7.7-hcff3b4d_5/include/python3.7m/Python.h

我尝试用 #include <Python.h> 替换 main.cpp 中的 #include <PATH>,其中 PATH 替换为上面列出的路径之一。在所有三种情况下,我都会收到一个错误

undefined reference to 'Py_Initialize'

有人可以指出我在这里遗漏了什么吗?另外我在这台机器上没有 sudo 权限

更新: 这个问题和 Guillame Racicot 的解决方案适用于 cmake 1.13.5 版。正如 Guillame 所指出的,不同版本的 cmake 的解决方案可能会有所不同。

解决方法

使用 find_package 时,您还必须将其链接到目标:

find_package(Python3 REQUIRED COMPONENTS Interpreter Development)

add_executable(main main.cpp)

# Adds the proper include directories and link to libraries
target_link_libraries(main PUBLIC Python3::Python)

关于 CMake 的工作原理以及目标和导入的目标如何工作的文档,请参阅 cmake-buildsystem(7)

要了解导入时要做什么,请参阅该模块的文档。例如,这里是 FindPython3 的文档。有一个包含所有要链接的目标和所有可以找到的组件的列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。