cmake 找到错误的 python 库

21 投票
4 回答
28631 浏览
提问于 2025-04-17 03:42

我刚接触CMake,有些用法概念不太明白。

我在一个C++程序里调用了一个Python脚本:

#include <Python.h>
...
Py_Initialize();
PyRun_SimpleFile(...);
Py_Finalize();

在我的CMake文件里对应的设置是:

FIND_PACKAGE(PythonLibs REQUIRED)
...
TARGET_LINK_LIBRARIES(MyApplication ${PYTHON_LIBRARIES})

这段代码能正常工作,只要我的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(Python的模块搜索路径)改回正常,我在我的Python脚本顶部添加了

try:
  import some_package
except ImportError:
  if "my_python_path" in sys.path: raise
  sys.path.append("my_python_path")

4 个回答

1

你可以手动设置在 cmake 的库文件 \usr\share\cmake-3.2.3\Modules\FindPythonLibs.cmake 中:

set(PYTHON_LIBRARY "\\usr\\lib\\python2.7")
set(PYTHON_INCLUDE_DIR "\\usr\\include\\python2.7")
15

解决找到错误版本的问题(比如找到了3.0而不是2.7)最好的办法是给find_package指定一个最低版本(这样就会选择任何大于等于2.7的版本):

FIND_PACKAGE(PythonLibs 2.7 REQUIRED)

或者你也可以直接指定要找的确切版本:

FIND_PACKAGE(PythonLibs 2.7.5 EXACT REQUIRED)
15

你可以通过指定你的Python库的路径来告诉cmake在哪里找到这个PythonLibs,方法如下:

cmake -DPYTHON_LIBRARIES=/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib .

这样做之后,cmake中的${PYTHON_LIBRARIES}就会设置为正确的路径。

如果你想知道除了PYTHON_LIBRARIES之外,还有哪些其他选项可以提供给cmake(使用-DARG选项),可以尝试运行:

ccmake .

然后按下c来配置,按t来查看高级选项。

例如,你可能还想设置:

-DPYTHON_LIBRARY='/softwarepath/Python/Python2.7/lib/libpython2.7.so'
-DPYTHON_INCLUDE='/softwarepath/Python/Python2.7/include'

撰写回答