如何用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
相关产品推荐
相关产品推荐

