简化 CMakeLists.txt 中的 Python 链接

简介

在使用 CMake 构建 C++ 项目时,经常需要链接到 Python 解释器,特别是当你的项目需要与 Python 进行交互时,比如创建 Python 扩展模块。然而,对于每个模块都单独设置链接到 Python 的操作可能显得冗长且容易出错。本文将介绍如何通过简单的方法,在 CMake 中一次性设置所有模块链接到 Python,从而提高项目的可维护性和一致性。

前言

  1. 配置说明:[python C/C++混合编程]Windows下pybind11在CLion中的配置方式
  2. 项目示例:github pybind_study

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 解释器。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值