CMake中如何让子目录的find_package使用VCPKG查找依赖
问题根因
CMAKE_TOOLCHAIN_FILE变量仅在CMake执行project()指令、初始化项目构建环境时生效,你将该变量的设置放在project()之后,已经错过了VCPKG工具链的加载时机,因此find_package会沿用系统默认的查找路径,优先找到CentOS 7自带的低版本sqlite3。你单独构建PROJ目录时,是在配置阶段就传入了工具链参数,相当于在PROJ自身的project()执行前就加载了VCPKG工具链,因此能正确识别依赖。
解决方案
方案1:在CMakeLists中前置VCPKG配置
将VCPKG相关变量的设置移到cmake_minimum_required之后、project()指令之前,调整后的父项目CMakeLists如下:
cmake_minimum_required(VERSION 3.13) # VCPKG配置必须放在project指令之前 set(CMAKE_TOOLCHAIN_FILE "/home/user/Documents/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "") set(VCPKG_TARGET_TRIPLET "x64-linux" CACHE STRING "") # 按需可选配置:如果需要优先用静态依赖可加下行 # set(VCPKG_LIBRARY_LINKAGE static) project(test) set(CMAKE_CXX_STANDARD 17) add_subdirectory(external/PROJ) add_executable(test main.cpp) target_link_libraries(test PRIVATE PROJ::proj)
方案2:配置时通过命令行传参(更推荐)
不要在CMakeLists中硬编码个人本地的VCPKG路径,避免污染仓库公共配置,删除CMakeLists中手动设置CMAKE_TOOLCHAIN_FILE和VCPKG_TARGET_TRIPLET的代码,在执行cmake配置时通过参数传入:
# 先清理旧的构建缓存 rm -rf build # 重新配置 cmake -B build -S . \ -DCMAKE_TOOLCHAIN_FILE=/home/user/Documents/vcpkg/scripts/buildsystems/vcpkg.cmake \ -DVCPKG_TARGET_TRIPLET=x64-linux
额外注意事项
每次修改工具链相关配置后,必须完全删除旧的build目录再重新配置,避免旧的缓存路径干扰依赖查找。
内容的提问来源于stack exchange,提问作者Krupip
相关产品推荐
相关产品推荐

