cmake 找到错误的 python 库
我刚接触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 个回答
你可以手动设置在 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")
解决找到错误版本的问题(比如找到了3.0而不是2.7)最好的办法是给find_package指定一个最低版本(这样就会选择任何大于等于2.7的版本):
FIND_PACKAGE(PythonLibs 2.7 REQUIRED)
或者你也可以直接指定要找的确切版本:
FIND_PACKAGE(PythonLibs 2.7.5 EXACT REQUIRED)
你可以通过指定你的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'