如何将Bazel构建的C++项目集成至CMake项目?
将Bazel构建的C++共享库集成到CMake项目的实用方法
下面是几种适合新手的可行方案,按操作复杂度排序:
方案一:直接链接预构建的共享库(最简单)
先构建Bazel库
打开终端进入Bazel项目根目录,执行构建命令:bazel build //path/to:your_shared_lib构建产物会生成在
bazel-bin/path/to/目录下,找到对应平台的共享库文件:- Linux:
libyour_shared_lib.so - macOS:
libyour_shared_lib.dylib - Windows:
your_shared_lib.dll以及对应的导入库your_shared_lib.lib
- Linux:
在CMake项目中引入
修改CMake项目的CMakeLists.txt,添加以下代码(替换成你的实际路径和库名):# 指向Bazel构建产物的目录 set(BAZEL_LIB_ROOT "${CMAKE_SOURCE_DIR}/../bazel-bin/path/to") # 指向Bazel项目的头文件目录(需要包含库的.h文件) set(BAZEL_INCLUDE_ROOT "${CMAKE_SOURCE_DIR}/../bazel_project_root/include") # 查找共享库 find_library(YOUR_SHARED_LIB NAMES your_shared_lib PATHS ${BAZEL_LIB_ROOT} NO_DEFAULT_PATH ) # 链接到你的CMake目标 if(YOUR_SHARED_LIB) target_include_directories(your_cmake_target PRIVATE ${BAZEL_INCLUDE_ROOT}) target_link_libraries(your_cmake_target PRIVATE ${YOUR_SHARED_LIB}) else() message(FATAL_ERROR "找不到Bazel构建的共享库,请检查路径是否正确") endif()
方案二:让Bazel生成CMake配置文件(更规范)
部分Bazel规则支持生成CMake兼容的导出配置,省去手动路径配置:
修改Bazel的BUILD文件
在Bazel项目的BUILD文件中,为共享库添加生成CMake配置的特性:load("@rules_cc//cc:defs.bzl", "cc_shared_library") cc_shared_library( name = "your_shared_lib", srcs = glob(["src/**/*.cpp"]), hdrs = glob(["include/**/*.h"]), visibility = ["//visibility:public"], # 开启CMake配置生成 features = ["generate_cmake_config"], )CMake中引入
构建Bazel库后,在CMake项目中用find_package引入:find_package(your_shared_lib REQUIRED PATHS "${CMAKE_SOURCE_DIR}/../bazel-bin/path/to" ) target_link_libraries(your_cmake_target PRIVATE your_shared_lib::your_shared_lib)注:该特性需要较新版本的Bazel(建议5.0+),如果你的Bazel版本不支持,可以尝试第三方Bazel规则。
方案三:CMake自动触发Bazel构建(最自动化)
如果希望CMake编译时自动构建Bazel库,无需手动提前执行Bazel命令,可以用ExternalProject模块:
include(ExternalProject) # 定义Bazel项目的构建任务 ExternalProject_Add( bazel_shared_lib SOURCE_DIR "${CMAKE_SOURCE_DIR}/../bazel_project_root" BUILD_COMMAND bazel build //path/to:your_shared_lib INSTALL_COMMAND "" # 不需要安装,直接使用构建产物 # 声明构建产物,让CMake知道依赖关系 BUILD_BYPRODUCTS "${CMAKE_SOURCE_DIR}/../bazel-bin/path/to/libyour_shared_lib.so" ) # 导入构建好的共享库 add_library(your_shared_lib SHARED IMPORTED) set_target_properties(your_shared_lib PROPERTIES IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../bazel-bin/path/to/libyour_shared_lib.so" INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/../bazel_project_root/include" ) # 让CMake目标依赖Bazel构建任务 add_dependencies(your_cmake_target bazel_shared_lib) target_link_libraries(your_cmake_target PRIVATE your_shared_lib)
注:Windows平台需要额外设置
IMPORTED_IMPLIB属性指向.lib导入库。
关键注意事项
- 路径尽量用CMake内置变量(如
CMAKE_SOURCE_DIR),避免硬编码绝对路径,提升项目可移植性。 - 确保Bazel项目的头文件路径正确,否则CMake编译时会出现找不到头文件的错误。
- 不同平台的共享库后缀不同,需要根据目标平台调整文件名。
内容的提问来源于stack exchange,提问作者Nick Skywalker
相关产品推荐
相关产品推荐

