基于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
相关产品推荐
相关产品推荐

