使用PMM+VCPKG时find_package无法找到包目录的咨询
find_package无法找到已安装的依赖包 我正在使用pmm工具的VCPKG模式为项目添加依赖库,pmm安装正常,依赖包也已完成安装,但执行cmake的find_package(x)命令时,提示无法找到对应包。
经过调试,我手动将包的安装路径添加到cmake配置后功能恢复正常,但不确定该路径的通用性,想咨询:
- 如何无需手动指定路径即可正常使用?
- 是否必须添加该路径?
- 是否我对pmm的文档理解有误?
我的CMakeLists.txt代码如下:
cmake_minimum_required(VERSION 3.10) project(pmmAndVcpkg VERSION 0.0.0) set(VCPKG_REV 2022.05.10) include(pmm.cmake) pmm( VCPKG REVISION ${VCPKG_REV} REQUIRES fmt ) # 为什么我需要这段代码??? ################################ set(VCPKG_PATH $ENV{HOME}/.local/share/pmm/${PMM_VERSION_INIT}/vcpkg-${VCPKG_REV}/packages) set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${VCPKG_PATH} ${CMAKE_MODULE_PATH}) set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR} ${VCPKG_PATH} ${CMAKE_PREFIX_PATH}) ################################ find_package(fmt CONFIG REQUIRED) add_executable(main main.cpp) target_link_libraries(main PRIVATE fmt)
除该文件外,我仅添加了要求的pmm.cmake文件和用于验证链接的main.cpp文件。
你完全不需要手动添加CMAKE_MODULE_PATH和CMAKE_PREFIX_PATH——pmm的VCPKG模式设计目标就是自动处理这些路径配置,出现这个问题大概率是配置流程中的某个环节出现了异常,以下是排查和解决步骤:
1. 清理CMake缓存,重新生成
手动添加过路径后,CMake会缓存这些配置,即使后续移除手动配置也可能残留影响。执行以下操作:
- 删除项目的
build目录(或你用来生成构建文件的目录) - 重新运行CMake生成命令
2. 确认pmm是否正确初始化VCPKG工具链
pmm的VCPKG模式会自动下载指定版本的VCPKG,并配置CMake使用VCPKG的工具链文件。你可以检查CMake的输出日志,看是否包含类似-- Using vcpkg toolchain: ...的信息。如果没有,说明pmm没有正确完成工具链配置,可能的原因:
- 你的pmm版本与指定的VCPKG版本(2022.05.10)不兼容:尝试更新pmm到最新版本,或者匹配对应VCPKG版本的pmm版本
- pmm下载VCPKG时出现网络问题:查看pmm的输出日志是否有下载失败的提示,手动确认
$ENV{HOME}/.local/share/pmm/${PMM_VERSION_INIT}/vcpkg-${VCPKG_REV}目录是否存在且完整
3. 检查find_package的调用与路径逻辑
对于VCPKG安装的包,find_package(fmt CONFIG REQUIRED)是正确的调用方式,但需要注意:VCPKG的包配置文件实际存放在installed/<triplet>目录下(而非你手动指定的packages临时编译目录),pmm应该自动将这个正确路径添加到CMAKE_PREFIX_PATH中。你手动指定的packages目录并非通用路径,不应该依赖它。
4. 尝试显式指定VCPKG_TRIPLET(可选)
如果你的系统架构与VCPKG默认triplet不匹配,可能导致找不到包。可以在pmm命令中添加TRIPLET参数,例如:
pmm( VCPKG REVISION ${VCPKG_REV} REQUIRES fmt TRIPLET x64-linux # 根据你的系统替换,比如x64-windows、arm64-linux等 )
5. 验证pmm的环境变量初始化
pmm执行后会设置VCPKG_ROOT等环境变量,你可以在CMakeLists.txt中添加一行输出验证:
message(STATUS "VCPKG_ROOT: ${VCPKG_ROOT}")
如果输出为空,说明pmm没有正确初始化VCPKG环境,需要检查pmm.cmake的完整性,或重新下载最新版本的pmm.cmake。
内容的提问来源于stack exchange,提问作者AudioDroid

