如何使用 cmake 链接 Python3 库?

Posted

技术标签:

【中文标题】如何使用 cmake 链接 Python3 库?【英文标题】:How to link with Python3 Libs with cmake? 【发布时间】:2015-03-25 00:39:26 【问题描述】:

我通过brew install python3 安装了 Python3。但是,cmake 找不到 PythonLibs 3。这是我的 CMakeLists.txt 的标题。

cmake_minimum_required(VERSION 3.0)
find_package(PythonLibs 3 REQUIRED)

当我运行 cmake 时,我收到了这个错误信息

Could NOT find PythonLibs: Found unsuitable version "2.7.6", but required is at least "3" (found /usr/lib/libpython2.7.dylib)

不知道我做错了什么。

【问题讨论】:

看看***.com/questions/17694772/does-cmake-support-python3 - 这是一个非常相似的问题。最简单的建议是手动设置 Python 头文件和库的路径,但这不是一个很好的解决方案。我对brew 以及它如何影响事物一无所知... 谢谢,该链接中的解决方案有效,尽管它不再使我的代码跨平台:(。如果您不介意回答,我就同一主题提出了另一个问题***.com/questions/29267718/…。非常感谢@DavidW。 【参考方案1】:

根据我的经验,发生这种情况是因为我使用的是旧版本的 cmake(2.8 而不是 3+),它不了解 Python 3.4(它在 3.3 之后放弃了。)

解决方案是进入 CMakeLists.txt 文件并在 find_package 上方添加“附加版本”指令:

set(Python_ADDITIONAL_VERSIONS 3.4) find_package(PythonLibs 3 REQUIRED)

您也可以通过升级您的 cmake 版本来修复它。但以上内容对我来说适用于 cmake 2.8

【讨论】:

【参考方案2】:

因为你使用的是 CMake >= 3.0,你可以find_package(Python COMPONENTS Interpreter Development) 看到:https://cmake.org/cmake/help/v3.12/module/FindPython.html

这会给你例如:

find_package(Python COMPONENTS Interpreter Development)

message("Python_FOUND:$Python_FOUND")
message("Python_VERSION:$Python_VERSION")
message("Python_Development_FOUND:$Python_Development_FOUND")
message("Python_LIBRARIES:$Python_LIBRARIES")

结果:

Python_FOUND:TRUE
Python_VERSION:3.8.0
Python_Development_FOUND:TRUE
Python_LIBRARIES:/usr/lib/x86_64-linux-gnu/libpython3.8.so

【讨论】:

【参考方案3】:

另一个原因是 CMake 在 OSX 上从 brew 安装时永远找不到 Python 3。看起来 CMake 开发人员知道FindPythonLibs 很糟糕并且拥有a ticket to revamp it,但它看起来不会很快发生。

我相信 Python 解释器本身知道它的库和头文件在哪里,所以我认为最好的办法是运行它来找出答案。为了获得 Python 解释器的路径,我会强制用户手动指定它。 Python 的一大问题是许多软件都包含自己的副本,因此您最终会在系统上拥有 5 个副本。捡错的机会太高了。让用户指定正确的。

【讨论】:

以上是关于如何使用 cmake 链接 Python3 库?的主要内容,如果未能解决你的问题,请参考以下文章

如何理解CMake文档,优先静态库,Cuda混编

使用 cmake 如何静态链接一些库和动态链接其他库?

CMake配置工程链接库

如何使用 CMake 链接库?

如何使用 CMake 自动链接 boost 库

[cmake]如何使用 cmake 在 windows 上包含和链接系统库