cmake发现了错误的python库

mar*_*old 17 python macos cmake

我是CMake的新手,无法理解一些使用概念.

我正在从c ++程序调用python脚本:

#include <Python.h>
...
Py_Initialize();
PyRun_SimpleFile(...);
Py_Finalize();
Run Code Online (Sandbox Code Playgroud)

我的cmake文件中相应的cmake条目是:

FIND_PACKAGE(PythonLibs REQUIRED)
...
TARGET_LINK_LIBRARIES(MyApplication ${PYTHON_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

只要我的python脚本没有使用安装在site-packages目录中的任何模块,这就可以工作,否则我会得到一个ImportError.这个问题展示了如何使用CMake查找site-packages目录的位置,但是我应该告诉CMake如何处理呢?

编辑:问题解决了.事实证明,FIND_PACKAGE(PythonLibs)从我通常使用的内容中找到了不同的python安装(/usr/local/lib/libpython2.7.dylib而不是/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2. 7.dylib - 我在Mac上),这是我如何获得标准的python模块,但没有我自己安装.为了将PYTHONPATH改回正常,我补充道

try:
  import some_package
except ImportError:
  if "my_python_path" in sys.path: raise
  sys.path.append("my_python_path")
Run Code Online (Sandbox Code Playgroud)

在我的python脚本的顶部.

Joa*_*kim 14

解决找到错误版本的问题的最佳方法(例如3.0而不是2.7)是指定find_package的最小版本(这将选择任何版本> = 2.7):

FIND_PACKAGE(PythonLibs 2.7 REQUIRED)
Run Code Online (Sandbox Code Playgroud)

或者获得确切的版本:

FIND_PACKAGE(PythonLibs 2.7.5 EXACT REQUIRED)
Run Code Online (Sandbox Code Playgroud)


Jen*_*man 13

您可以通过指定python库的路径告诉cmake在哪里找到这个PythonLibs,如下所示:

cmake -DPYTHON_LIBRARIES=/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib .
Run Code Online (Sandbox Code Playgroud)

然后,这会将cmake中的$ {PYTHON_LIBRARIES}设置为正确的路径.

要找出哪些其他可能的选项(除了PYTHON_LIBRARIES)你可以给cmake(使用-DARG选项)尝试运行

ccmake .
Run Code Online (Sandbox Code Playgroud)

然后按c配置,以及t高级选项.

例如,您可能还想设置

-DPYTHON_LIBRARY='/softwarepath/Python/Python2.7/lib/libpython2.7.so'
-DPYTHON_INCLUDE='/softwarepath/Python/Python2.7/include'
Run Code Online (Sandbox Code Playgroud)

  • 我认为现在的CMake标志(用2.8.12.1测试)-DPYTHON_INCLUDE_DIR = $ PYTHON_ROOT/include/pythonX.Y和-DPYTHON_LIBRARY = $ PYTHON_ROOT/lib/libpythonX.Y.so(来自FindPythonLibs.cmake模块描述) (3认同)