如何基于预编译二进制创建可被find_package识别的vcpkg包?
基于预编译二进制创建vcpkg包并支持find_package的方法
当然可以基于预编译二进制文件创建支持find_package的vcpkg包,你不需要完全手动编写所有CMake配置文件,vcpkg提供了工具函数来自动生成必要的配置文件,下面是具体实现方式:
一、使用vcpkg自动生成CMake配置文件
在你的portfile.cmake中,除了复制头文件和库文件,还需要调用vcpkg提供的两个核心函数来生成并修正配置文件:
1. 基础实现步骤
# 复制预编译的库文件和头文件到vcpkg包目录 file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/lib DESTINATION ${CURRENT_PACKAGES_DIR}) file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/include DESTINATION ${CURRENT_PACKAGES_DIR}) # 生成CMake配置文件模板 vcpkg_generate_cmake_config( PACKAGE_NAME "YourPackageName" # 要和后续find_package使用的名称一致 CONFIG_PATH "share/${PORT}/cmake" # 配置文件存放路径,遵循vcpkg规范 ) # 修正配置文件路径,适配vcpkg的包结构 vcpkg_cmake_config_fixup( PACKAGE_NAME "YourPackageName" CONFIG_PATH "share/${PORT}/cmake" )
2. 自定义配置模板(可选)
如果你的包有特殊需求(比如多组件、依赖声明),可以手动创建一个配置模板文件YourPackageNameConfig.cmake.in,放在port所在目录:
@PACKAGE_INIT@ # 引入目标文件 include("${CMAKE_CURRENT_LIST_DIR}/YourPackageNameTargets.cmake") # 检查必要组件(如果有组件划分) check_required_components("@PROJECT_NAME@")
然后在vcpkg_generate_cmake_config中指定模板:
vcpkg_generate_cmake_config( PACKAGE_NAME "YourPackageName" CONFIG_PATH "share/${PORT}/cmake" TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/YourPackageNameConfig.cmake.in" )
二、手动编写CMake配置文件(复杂场景)
如果自动生成的配置无法满足你的需求(比如需要自定义链接逻辑、设置编译选项、声明依赖等),可以手动编写完整的CMake配置文件,包括:
YourPackageNameConfig.cmake:核心配置文件,处理包的查找逻辑YourPackageNameConfigVersion.cmake:版本匹配逻辑YourPackageNameTargets.cmake:定义包的导入目标
编写完成后,将这些文件安装到vcpkg的share目录:
file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/cmake/YourPackageNameConfig.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT}/cmake) file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/cmake/YourPackageNameConfigVersion.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT}/cmake) file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/cmake/YourPackageNameTargets.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT}/cmake)
内容的提问来源于stack exchange,提问作者Tac
相关产品推荐
相关产品推荐

