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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:57:04