Pythonlibs3 CMake 和 macOS
Pythonlibs3 CMake and macOS
[更新 2]
下面两行,添加到我的CMake文件后,成功找到了python3及其库。这仅在终端中起作用的原因是因为 CLion 使用其捆绑版本的 CMake (3.6.3),而我的终端使用的更新版本 (3.7.2) 正确找到 python.
FIND_PACKAGE(PythonInterp 3)
FIND_PACKAGE(PythonLibs 3)
[更新] 我让 cmake 文件可以工作,但是,当我从终端 运行 时,它只找到 python3 库。从 CLion 运行ning 时,出现以下错误:
CMake Error: The following variables are used in this project, but
they are set to NOTFOUND. Please set them or make sure they are set
and tested correctly in the CMake files: PYTHON_LIBRARY (ADVANCED)
[原创 POST]
我正在开发一个跨平台 C++ 应用程序并使用 PythonLibs 3 和 boost_python 以便能够从 python 调用 c++ 方法。在 ubuntu 上运行良好,但是在 macOS 上,我似乎无法让 cmake 识别 pythonlibs3.
在 ubuntu 上,以下行有效:
FIND_PACKAGE(PythonLibs 3 REQUIRED)
然而,在 macOS 上,它只能在 /usr/libs/
中运行 pythonlibs 2.7.10
我试过以下方法:
- 使用 python3 虚拟环境,然后 运行ning cmake。
- 正在将
set(Python_ADDITIONAL_VERSIONS 3.6)
添加到我的 cmake
其他信息:
- 我用 brew 安装了 python3 (3.6),它位于 /usr/local/bin
- 我正在使用 cmake 版本 3.6.3
- 当我写
FIND_PACKAGE(PythonInterp 3)
时,cmake 能够找到我的 python3 安装。
- 检查我的
/usr/lib/
文件夹时,我发现 libpython2.7.dylib
但 /usr/lib/
或 /usr/local/lib/
中都没有 libpython3.6/dylib
。这似乎是因为此文件位于 /usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib
。
如果我将 libpython3.6 的位置添加到我的 find_package,
FIND_PACKAGE(PythonLibs 3 PATHS /usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/ REQUIRED)
它能够找到库,但随后出现错误:
Could not find a package configuration file provided by "PythonLibs"
(requested version 3) with any of the following names:
PythonLibsConfig.cmake
pythonlibs-config.cmake
Add the installation prefix of "PythonLibs" to CMAKE_PREFIX_PATH or
set "PythonLibs_DIR" to a directory containing one of the above
files. If "PythonLibs" provides a separate development package or
SDK, be sure it has been installed.
此外,如果我尝试在不使用 find_package 的情况下设置 python 变量,它能够找到库:
SET(PYTHON_INCLUDE_PATH /usr/local/include/python3.6mu)
SET(PYTHON_EXECUTABLE /usr/local/bin/python3.6mu)
SET(PYTHON_INCLUDE_DIR /usr/local/include/python3.6mu)
SET(PYTHON_LIBRARIES /usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/)
但后来在我的 cmake 中,我在以下行中收到错误:
PYTHON_ADD_MODULE(${PYRITMO_LIB} src/pythonwrappers.cpp)
错误为:
Unknown CMake command "PYTHON_ADD_MODULE".
这似乎是因为这个函数是由FindPythonLibs.cmake
提供的,它是由find_package(Pythonlibs)
加载的,因此,如果不使用它来定位PythonLibs,则无法调用该函数.
如上文问题更新所述,转移到 CMake 3.7.2 并使用以下两行解决了我的问题:
FIND_PACKAGE(PythonInterp 3)
FIND_PACKAGE(PythonLibs 3)
[更新] 对于任何使用 Google 测试并通过 CMake 安装它的人来说,重要的是将上述行放在 Google 测试代码之前。这是因为Googletest会找python,找到python2,那么当这两行是运行的时候,就找不到python ] 3.
如果这两行放在 Google 测试安装代码之前,那么 python3 将被找到并用于 google 测试。
[更新 2]
下面两行,添加到我的CMake文件后,成功找到了python3及其库。这仅在终端中起作用的原因是因为 CLion 使用其捆绑版本的 CMake (3.6.3),而我的终端使用的更新版本 (3.7.2) 正确找到 python.
FIND_PACKAGE(PythonInterp 3)
FIND_PACKAGE(PythonLibs 3)
[更新] 我让 cmake 文件可以工作,但是,当我从终端 运行 时,它只找到 python3 库。从 CLion 运行ning 时,出现以下错误:
CMake Error: The following variables are used in this project, but they are set to NOTFOUND. Please set them or make sure they are set and tested correctly in the CMake files: PYTHON_LIBRARY (ADVANCED)
[原创 POST]
我正在开发一个跨平台 C++ 应用程序并使用 PythonLibs 3 和 boost_python 以便能够从 python 调用 c++ 方法。在 ubuntu 上运行良好,但是在 macOS 上,我似乎无法让 cmake 识别 pythonlibs3.
在 ubuntu 上,以下行有效:
FIND_PACKAGE(PythonLibs 3 REQUIRED)
然而,在 macOS 上,它只能在 /usr/libs/
我试过以下方法:
- 使用 python3 虚拟环境,然后 运行ning cmake。
- 正在将
set(Python_ADDITIONAL_VERSIONS 3.6)
添加到我的 cmake
其他信息:
- 我用 brew 安装了 python3 (3.6),它位于 /usr/local/bin
- 我正在使用 cmake 版本 3.6.3
- 当我写
FIND_PACKAGE(PythonInterp 3)
时,cmake 能够找到我的 python3 安装。 - 检查我的
/usr/lib/
文件夹时,我发现libpython2.7.dylib
但/usr/lib/
或/usr/local/lib/
中都没有libpython3.6/dylib
。这似乎是因为此文件位于/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib
。
如果我将 libpython3.6 的位置添加到我的 find_package,
FIND_PACKAGE(PythonLibs 3 PATHS /usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/ REQUIRED)
它能够找到库,但随后出现错误:
Could not find a package configuration file provided by "PythonLibs"
(requested version 3) with any of the following names:PythonLibsConfig.cmake pythonlibs-config.cmake
Add the installation prefix of "PythonLibs" to CMAKE_PREFIX_PATH or set "PythonLibs_DIR" to a directory containing one of the above files. If "PythonLibs" provides a separate development package or SDK, be sure it has been installed.
此外,如果我尝试在不使用 find_package 的情况下设置 python 变量,它能够找到库:
SET(PYTHON_INCLUDE_PATH /usr/local/include/python3.6mu)
SET(PYTHON_EXECUTABLE /usr/local/bin/python3.6mu)
SET(PYTHON_INCLUDE_DIR /usr/local/include/python3.6mu)
SET(PYTHON_LIBRARIES /usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/)
但后来在我的 cmake 中,我在以下行中收到错误:
PYTHON_ADD_MODULE(${PYRITMO_LIB} src/pythonwrappers.cpp)
错误为:
Unknown CMake command "PYTHON_ADD_MODULE".
这似乎是因为这个函数是由FindPythonLibs.cmake
提供的,它是由find_package(Pythonlibs)
加载的,因此,如果不使用它来定位PythonLibs,则无法调用该函数.
如上文问题更新所述,转移到 CMake 3.7.2 并使用以下两行解决了我的问题:
FIND_PACKAGE(PythonInterp 3)
FIND_PACKAGE(PythonLibs 3)
[更新] 对于任何使用 Google 测试并通过 CMake 安装它的人来说,重要的是将上述行放在 Google 测试代码之前。这是因为Googletest会找python,找到python2,那么当这两行是运行的时候,就找不到python ] 3.
如果这两行放在 Google 测试安装代码之前,那么 python3 将被找到并用于 google 测试。