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

如何用CMake构建Git子模块oneTBB动态库及METIS依赖?

问题1:Intel oneTBB的CMake自动构建适配优化

项目结构

external/
    | - CMakeLists.txt
    | - oneTBB/  (Git子模块)
    | - ...
include/
lib/
CMakeLists.txt

当前手动构建方式

cd oneTBB
mkdir -p prefix
mkdir -p build
cd build
cmake -DCMAKE_INSTALL_PREFIX=../prefix -DTBB_TEST=OFF ..
cmake --build .
cmake --install .

问题描述

通过add_subdirectory(oneTBB)自动构建时,出现大量警告:首条提示正在构建不推荐且不被支持的oneTBB静态库,同时存在CMP0069相关开发警告。需求是构建动态库,无需系统级安装,仅需能链接到主项目。

解决方案

在external/CMakeLists.txt中添加oneTBB子目录前,明确设置构建选项,强制生成动态库并关闭测试,同时解决CMP0069警告:

# 配置oneTBB为动态库构建
set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries" FORCE)
# 关闭oneTBB测试编译
set(TBB_TEST OFF CACHE BOOL "Disable TBB tests" FORCE)
# 统一CMP0069策略,消除警告
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW CACHE STRING "Default policy for CMP0069" FORCE)

# 添加oneTBB子模块
add_subdirectory(oneTBB)

主项目中直接链接oneTBB提供的官方目标即可,无需手动指定头文件和库路径:

# 主项目CMakeLists.txt中
target_link_libraries(你的项目名称 PRIVATE TBB::tbb)

问题2:METIS依赖GKlib的CMake自动构建错误

当前手动构建方式

# 构建GKlib库:
cd GKlib
mkdir -p prefix
mkdir -p build
cd build
cmake -DCMAKE_INSTALL_PREFIX=../prefix ..
cmake --build . -j
cmake --install .
cd ../../

# 构建METIS库:
cd METIS
mkdir -p prefix
make config prefix=../prefix gklib_path=../GKlib/prefix
make install -j
cd ../

问题描述

使用add_subdirectory(GKlib)和add_subdirectory(METIS)自动构建时,出现错误:

CMake Error at external/METIS/CMakeLists.txt:50 (add_subdirectory):
  add_subdirectory given source "build/xinclude" which is not an existing
  directory.

解决方案

METIS的原生CMake配置依赖make config步骤生成build/xinclude目录,直接用add_subdirectory会跳过该步骤导致错误。推荐使用ExternalProject_Add模拟手动构建流程,确保依赖顺序和目录生成:

在external/CMakeLists.txt中添加:

include(ExternalProject)

# 构建GKlib,安装到临时目录
ExternalProject_Add(
    GKlib
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/GKlib
    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/GKlib-build
    CMAKE_ARGS
        -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/GKlib-install
        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
    INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/GKlib-install
    BUILD_COMMAND cmake --build . -j
)

# 构建METIS,依赖已安装的GKlib
ExternalProject_Add(
    METIS
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/METIS
    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/METIS-build
    # 模拟手动的make config步骤
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/METIS/configure
        prefix=${CMAKE_CURRENT_BINARY_DIR}/METIS-install
        gklib_path=${CMAKE_CURRENT_BINARY_DIR}/GKlib-install
        shared=1  # 构建动态库
    BUILD_COMMAND make -j
    INSTALL_COMMAND make install
    DEPENDS GKlib  # 确保GKlib先构建完成
)

# 为主项目导出METIS的链接信息
ExternalProject_Get_Property(METIS INSTALL_DIR)
set(METIS_INCLUDE_DIR ${INSTALL_DIR}/include)
set(METIS_LIBRARY ${INSTALL_DIR}/lib/libmetis${CMAKE_SHARED_LIBRARY_SUFFIX})
add_library(METIS::METIS SHARED IMPORTED)
set_target_properties(METIS::METIS PROPERTIES
    IMPORTED_LOCATION ${METIS_LIBRARY}
    INTERFACE_INCLUDE_DIRECTORIES ${METIS_INCLUDE_DIR}
)
add_dependencies(METIS::METIS METIS)

主项目中直接链接导入的目标:

target_link_libraries(你的项目名称 PRIVATE METIS::METIS)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:55:17