简介
在使用 CMake 构建 C++ 项目时,经常需要链接到 Python 解释器,特别是当你的项目需要与 Python 进行交互时,比如创建 Python 扩展模块。然而,对于每个模块都单独设置链接到 Python 的操作可能显得冗长且容易出错。本文将介绍如何通过简单的方法,在 CMake 中一次性设置所有模块链接到 Python,从而提高项目的可维护性和一致性。
前言
1. 方法
步骤一:定义链接函数
首先,我们可以编写一个函数来处理 Python 的链接,以便在需要的地方调用该函数。在 CMakeLists.txt 文件中添加以下代码:
function(link_to_python target)
target_link_libraries(${target} PUBLIC ${PYTHON3_LIB} ${PYTHON311_LIB})
endfunction()
这个函数接受一个参数 target
,代表要链接的目标(例如模块)。在函数内部,我们使用 target_link_libraries
命令将目标链接到 Python 的库。
步骤二:调用链接函数
现在,我们可以在每个模块的构建过程中调用上面定义的函数。例如:
link_to_python(module1)
link_to_python(module2)
link_to_python(module3)
这样,我们只需要在一个地方设置 Python 的链接方式,然后在每个模块的构建过程中调用该函数即可。
2 实例
代码可从前言项目示例中获取
项目结构
- project_folder
|- CMakeLists.txt
|- core
|- add
|- CMakeLists.txt
project_folder/CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
project(pybind_test)
#************************************基础配置***********************************************************
# 添加子目录 pybind11
add_subdirectory(extern/pybind11)
# 添加包含目录
include_directories(
"E:\\DataBuffer\\hurleykane\\miniconda3\\include"
"pybind11\\include"
)
# 添加库目录
set(PYTHON_LIB_DIR "E:\\DataBuffer\\hurleykane\\miniconda3\\libs")
find_library(PYTHON3_LIB python3 PATHS ${PYTHON_LIB_DIR})
find_library(PYTHON311_LIB python311 PATHS ${PYTHON_LIB_DIR})
link_directories(${PTTHON_LIB_DIR})
# 添加依赖项函数
function(link_to_python target_module)
target_link_libraries(${target_module} PUBLIC
${PYTHON3_LIB}
${PYTHON311_LIB}
)
endfunction()
#******************************访问子文件CMakeLists.txt*********************************************
add_subdirectory(core/add)
core/add/CMakeLists.txt
# 加入cpp文件
pybind11_add_module(add SHARED add.cpp)
# 设置输出文件后缀名为 .pyd
set_target_properties(
add PROPERTIES SUFFIX ".pyd"
)
# 添加依赖项
link_to_python(add)
结论
通过上述简单的步骤,我们成功地简化了 CMake 中模块链接到 Python 的操作。通过定义一个链接函数,我们可以在整个项目中一次性设置所有模块链接到 Python,从而提高了项目的可维护性和一致性。这种方法避免了重复代码,同时确保了所有模块都正确地链接到 Python 解释器。