CMake中如何让OpenVDB找到已源码构建的Boost依赖?
问题解决:让OpenVDB识别FetchContent获取的Boost
问题根源
- FetchContent默认获取的Boost未启用CMake构建模式,仅提供头文件,不会编译
iostreams这类需要编译的组件,导致OpenVDB的find_package(Boost)找不到对应库文件。 - OpenVDB的CMake配置会独立调用
find_package(Boost),默认优先搜索系统路径,不会自动识别通过FetchContent获取的本地Boost版本。
修改后的完整CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(MyOpenVDBProject CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) include(FetchContent) # 获取并构建Boost,启用CMake模式并编译iostreams组件 FetchContent_Declare( Boost URL https://archives.boost.io/release/1.88.0/source/boost_1_88_0.tar.gz URL_HASH SHA256=3621533e820dcab1e8012afd583c0c73cf0f77694952b81352bf38c1488f9cb4 CMAKE_ARGS -DBOOST_ENABLE_CMAKE=ON -DBOOST_COMPONENTS=iostreams -DBUILD_SHARED_LIBS=ON # 需静态库可改为OFF ) FetchContent_MakeAvailable(Boost) # 将Boost构建目录加入搜索路径,引导后续find_package优先查找 set(CMAKE_PREFIX_PATH "${Boost_BINARY_DIR};${CMAKE_PREFIX_PATH}") FetchContent_Declare( oneTBB URL https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2021.11.0.tar.gz URL_HASH SHA256=782ce0cab62df9ea125cdea253a50534862b563f1d85d4cda7ad4e77550ac363 ) FetchContent_MakeAvailable(oneTBB) FetchContent_Declare( blosc URL https://github.com/Blosc/c-blosc/archive/refs/tags/v1.21.5.tar.gz URL_HASH SHA256=32e61961bbf81ffea6ff30e9d70fca36c86178afd3e3cfa13376adec8c687509 ) FetchContent_MakeAvailable(blosc) set(CMAKE_PREFIX_PATH "${blosc_BINARY_DIR};${CMAKE_PREFIX_PATH}") # 获取OpenVDB,强制使用预获取的依赖版本 FetchContent_Declare( OpenVDB URL https://github.com/AcademySoftwareFoundation/openvdb/archive/refs/tags/v11.0.0.tar.gz URL_HASH SHA256=6314ff1db057ea90050763e7b7d7ed86d8224fcd42a82cdbb9c515e001b96c74 CMAKE_ARGS -DBoost_ROOT=${Boost_SOURCE_DIR} -DTBB_ROOT=${oneTBB_SOURCE_DIR} -DBLOSC_ROOT=${blosc_SOURCE_DIR} -DOPENVDB_BUILD_EXAMPLES=OFF # 关闭无用构建项加速编译 -DOPENVDB_BUILD_TESTS=OFF ) FetchContent_MakeAvailable(OpenVDB) # 若需编译自定义代码,取消以下注释并添加源文件 # add_executable(my_app main.cpp) # target_link_libraries(my_app PRIVATE OpenVDB::openvdb)
关键修改说明
- Boost构建配置:添加
CMAKE_ARGS启用BOOST_ENABLE_CMAKE,让Boost使用CMake编译iostreams组件,解决仅头文件无编译库的问题。 - 搜索路径设置:将Boost、blosc的构建目录加入
CMAKE_PREFIX_PATH,让OpenVDB的find_package优先搜索本地预获取的依赖。 - OpenVDB依赖指定:通过
CMAKE_ARGS直接传递预获取依赖的根目录,强制OpenVDB使用我们指定的版本,避免重复拉取依赖。
内容的提问来源于stack exchange,提问作者cosama
相关产品推荐
相关产品推荐

