You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于CMake的C++项目集成Pybind11后构建可执行文件失败

解决CMake构建可执行文件时找不到pybind11头文件的问题

问题根源

pybind11_add_module这个CMake函数会自动为Python模块目标配置好pybind11的头文件搜索路径、编译选项等依赖,但手动用add_executable创建的exec_example目标不会自动继承这些配置,所以编译可执行文件时找不到pybind11/pybind11.h。

解决方案

给exec_example目标添加pybind11的头文件依赖即可,两种简单实现方式:

方式1:链接pybind11接口目标

CMake导入pybind11后会提供pybind11::headers接口目标,直接链接它就能自动添加头文件路径:

add_executable(exec_example src/main.cpp)
# 添加这一行
target_link_libraries(exec_example PRIVATE pybind11::headers)

方式2:手动指定头文件目录

如果方式1不生效,也可以直接指定pybind11的include目录:

add_executable(exec_example src/main.cpp)
# 添加这一行
target_include_directories(exec_example PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/pybind11/include)

优化建议(可选)

把C++核心逻辑和pybind11绑定代码分离会更合理:

  • 将add函数、main函数放到src/core.cpp,单独编译成静态库
  • 将pybind11绑定代码放到src/bindings.cpp,用pybind11_add_module编译
  • 可执行文件只链接核心静态库,无需依赖pybind11,减少不必要的编译依赖

修改后的完整CMakeLists.txt示例

cmake_minimum_required(VERSION 3.4...3.18)
project(cmake_example)

set(CMAKE_CXX_STANDARD 17)

add_subdirectory(pybind11)
pybind11_add_module(cmake_example src/main.cpp)

target_compile_definitions(cmake_example
                           PRIVATE VERSION_INFO=${EXAMPLE_VERSION_INFO})

add_executable(exec_example src/main.cpp)
# 添加的依赖配置
target_link_libraries(exec_example PRIVATE pybind11::headers)

验证步骤

重新执行构建命令:

rm -rf build
mkdir build
cd build
cmake ..
make

此时会同时生成cmake_example Python模块和exec_example可执行文件,编译不再报错。

内容的提问来源于stack exchange,提问作者Joxixi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:28:09