概述
vcpkg
是一个 C++ 包管理器,用于 Windows、Linux 和 macOS。它由 Microsoft 维护,并支持大量的 C++ 库。使用 vcpkg
,你可以轻松地安装、升级和管理 C++ 依赖库。
实践
安装 vcpkg
git clone https://github.com/microsoft/vcpkg
./bootstrap-vcpkg.sh
./vcpkg —version
vcpkg package management program version 2024-04-23-d6945642ee5c3076addd1a42c331bbf4cfc97457
See LICENSE.txt for license information.
vcpkg integrate bash
Adding vcpkg completion entry to /home/abel/.bashrc.
将目录增加到 PATH 里面方便运行。
尝试基本操作
1 |
|
build
1 | # 设置好 VCPKG_ROOT 环境变量 |
不要去使用,因为没有用。
1 | set(CMAKE_TOOLCHAIN_FILE "/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake" |
在使用 vcpkg 管理项目依赖时,vcpkg.json 是一个配置文件,专门用来定义项目所需的依赖库以及版本信息。通过这种方式,vcpkg 会自动解析并安装这些库,从而让项目构建更加方便和可重复。
vcpkg.json 的主要功能
• 定义项目所依赖的库及版本号。
• 自动管理依赖库的安装、更新和清理。
• 与 CMake 等构建工具无缝集成。
vcpkg.json 文件的基本结构
以下是一个示例的 vcpkg.json 配置文件:
{
“name”: “my-cool-project”,
“version”: “1.0.0”,
“description”: “A project using vcpkg to manage dependencies.”,
“dependencies”: [
{ “name”: “fmt”, “version>=”: “9.1.0” },
“boost”,
“openssl”
],
“builtin-baseline”: “abcd1234efgh5678ijkl9012mnop3456qrst7890”
}
字段说明
1. name:
• 项目名称,通常是你项目的标识符。
• 例如:"my-cool-project"
2. version:
• 项目版本号,遵循语义化版本规则。
• 例如:"1.0.0"
3. description:
• 对项目的简要描述(可选)。
• 例如:"A project using vcpkg to manage dependencies."
4. dependencies:
• 项目依赖的库,可以是库名或指定版本的对象。
• 支持的格式:
• 仅指定库名:"boost"
• 指定版本范围:{ "name": "fmt", "version>=": "9.1.0" }
5. builtin-baseline:
• 指定 vcpkg 使用的 Git 基线版本(必须匹配你的 vcpkg 克隆仓库的某次提交),确保依赖解析的一致性。
• 例如:"abcd1234efgh5678ijkl9012mnop3456qrst7890"
使用 vcpkg.json 管理项目依赖
- 初始化 vcpkg.json
在项目根目录创建 vcpkg.json 文件并填入依赖信息。例如:
{
“name”: “my-example”,
“version”: “1.0.0”,
“dependencies”: [
“fmt”,
“boost”,
{ “name”: “openssl”, “version>=”: “1.1.1” }
],
“builtin-baseline”: “abcd1234efgh5678ijkl9012mnop3456qrst7890”
}
- 运行依赖安装命令
在 vcpkg 根目录下,运行以下命令解析和安装依赖:
vcpkg install
• 该命令会读取项目的 vcpkg.json 文件,自动安装依赖库及其版本。
- 与 CMake 项目集成
在项目的 CMakeLists.txt 文件中,启用 vcpkg.json 集成:
CMakeLists.txt
设置 vcpkg 的工具链文件
set(CMAKE_TOOLCHAIN_FILE “${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake”)
项目定义
project(my-example)
添加依赖的库
find_package(fmt CONFIG REQUIRED)
find_package(Boost REQUIRED)
链接库到目标
add_executable(main main.cpp)
target_link_libraries(main PRIVATE fmt::fmt Boost::Boost)
运行 CMake 时会自动解析和使用 vcpkg.json 中定义的依赖。
- 其他有用的命令
• 升级依赖库:
vcpkg upgrade
根据 vcpkg.json 检查并升级依赖库版本。
• 移除未使用的库:
vcpkg remove —outdated
• 查看安装的库:
vcpkg list
依赖版本管理
在 dependencies 中可以使用以下方式定义版本:
1. 不指定版本(默认最新):
“dependencies”: [“fmt”, “boost”]
2. 指定最小版本:
“dependencies”: [
{ “name”: “fmt”, “version>=”: “9.1.0” }
]
3. 指定精确版本:
“dependencies”: [
{ “name”: “fmt”, “version”: “9.1.0” }
]
4. 版本范围(不常用):
“dependencies”: [
{ “name”: “fmt”, “version>=”: “9.0.0”, “version<=”: “9.1.0” }
]
使用场景和优势
• 简化依赖管理:开发者只需定义依赖,vcpkg 自动安装和管理。
• 一致性保证:builtin-baseline 确保团队中的每个人使用相同版本的依赖。
• 版本更新简单:通过更新 vcpkg.json 和 builtin-baseline 即可完成依赖升级。
如果你需要帮助配置具体依赖或项目集成,欢迎提供更多信息!
好的,我帮你整理一份 vcpkg 使用手册(Markdown 格式),结合你在 macOS 上遇到的问题和常见操作,同时包含 Linux 下的用法。文档会标明常见坑和注意事项。
⸻
vcpkg 使用手册
- vcpkg 简介
vcpkg 是微软提供的 C/C++ 包管理工具,支持跨平台安装第三方库,适合在 macOS、Linux、Windows 下统一管理依赖。
• 管理依赖:boost, protobuf, mysql, redis++ 等。
• 与 CMake 集成,通过 CMAKE_TOOLCHAIN_FILE 指定。
• 支持多平台、arm64/x86 架构。
⸻
- 基本操作
2.1 克隆 vcpkg
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh # Linux/macOS
.\bootstrap-vcpkg.bat # Windows
2.2 安装库
./vcpkg install <库名>:
• <triplet> 指编译平台和架构,例如:
• x64-osx → macOS x64
• arm64-osx → macOS ARM
• x64-linux → Linux x64
示例:
./vcpkg install boost:arm64-osx —without-python
./vcpkg install protobuf:arm64-osx
./vcpkg install libmysql:arm64-osx
./vcpkg install spdlog:arm64-osx
./vcpkg install redis++:arm64-osx
./vcpkg install nlohmann-json:arm64-osx
./vcpkg install curl:arm64-osx
2.3 搜索库
./vcpkg search <关键字>
示例:
./vcpkg search mysql
输出可能包含:
• libmysql → 官方 MySQL 客户端库
• libmariadb → MariaDB Connector/C(兼容 MySQL)
• boost-mysql → Boost MySQL 模块
• mysql-connector-cpp → MySQL C++ 连接器
⚠️ 注意:有些旧库(如 mysql-connector-c、mariadb-connector-c)在新版 vcpkg 已经不存在,使用 libmysql 或 libmariadb 替代。
2.4 列出已安装库
./vcpkg list
2.5 更新 vcpkg
git pull
./vcpkg update
2.6 移除库
./vcpkg remove <库名>
2.7 清理 / 重装库
如果出现 SDK 路径错误或编译失败:
./vcpkg remove —outdated
./vcpkg remove <库名>
./vcpkg install <库名>:
macOS 上常见问题:SDK 版本不一致(如 Xcode 升级后仍指向 MacOSX14.5.sdk),需要重新指定:
export CMAKE_OSX_SYSROOT=$(xcrun —sdk macosx —show-sdk-path)
或者在 CMake 命令中指定:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DCMAKE_OSX_SYSROOT=$(xcrun —sdk macosx —show-sdk-path)
⸻
- CMake 集成
3.1 使用 vcpkg toolchain
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
• macOS 上可指定 SDK:
-DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
3.2 在 CMakeLists.txt 中引用
find_package(Boost REQUIRED CONFIG COMPONENTS system filesystem program_options)
find_package(Protobuf CONFIG REQUIRED)
find_package(MySQL REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(redis++ CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(CURL REQUIRED)
target_link_libraries(your_target PRIVATE
Boost::system
Boost::filesystem
protobuf::libprotobuf
MySQL::MySQL
spdlog::spdlog_header_only
redis++::redis++
nlohmann_json::nlohmann_json
CURL::libcurl
)
⸻
- macOS SDK 常见问题
- libresolv.tbd / SDK 错误
• 出现 /usr/lib/libresolv.tbd 丢失或指向旧 SDK(MacOSX14.5.sdk)。
• 解决方法: - 检查 SDK 路径:
- libresolv.tbd / SDK 错误
xcrun —sdk macosx —show-sdk-path
2. 重新生成 CMake:
rm -rf build/
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DCMAKE_OSX_SYSROOT=$(xcrun —sdk macosx —show-sdk-path)
2. 强制替换旧 SDK
• 如果 vcpkg port 文件中写死了旧 SDK,可以批量替换:
grep -rl “MacOSX14.5.sdk” ./vcpkg/installed/arm64-osx | while read f; do
sed -i ‘’ ‘s#MacOSX14.5.sdk#MacOSX.sdk#g’ “$f”
done
⸻
- Linux 使用示例
• 安装库(x64 Linux):
./vcpkg install boost:x64-linux
./vcpkg install protobuf:x64-linux
./vcpkg install libmysql:x64-linux
./vcpkg install spdlog:x64-linux
./vcpkg install redis++:x64-linux
./vcpkg install nlohmann-json:x64-linux
./vcpkg install curl:x64-linux
• CMake 集成与 macOS 一样:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
⸻
- 小技巧 / 常见坑
问题 原因 解决方法
找不到 libmysql / MySQLConfig.cmake 端口名不对(旧库) 使用 libmysql 或 libmariadb
编译 boost 时不需要 Python 默认启用 python ./vcpkg install boost —without-python
macOS SDK 版本错误 port 文件写死旧 SDK 替换 SDK 或重新安装库
编译失败 python3:arm64-osx vcpkg python3 port 构建问题 可跳过 python 依赖,或者查看 官方问题
搜索到 binary 文件匹配 grep -R 也会匹配二进制 用 grep -a 或 strings 过滤可读文本
⸻
- 安装示例脚本(macOS arm64)
!/bin/bash
VCPKG_ROOT=~/vcpkg
TRIPLET=arm64-osx
更新 vcpkg
cd $VCPKG_ROOT
git pull
./bootstrap-vcpkg.sh
安装依赖
./vcpkg install boost:$TRIPLET —without-python
./vcpkg install protobuf:$TRIPLET
./vcpkg install libmysql:$TRIPLET
./vcpkg install spdlog:$TRIPLET
./vcpkg install redis++:$TRIPLET
./vcpkg install nlohmann-json:$TRIPLET
./vcpkg install curl:$TRIPLET
⸻
我可以帮你再生成一个 Linux 版本的安装脚本,和一个 CLion / VSCode 配置模板,直接就能在不同平台上切换。
你希望我帮你写吗?
完全对,你的担心很合理。问题在于:
⸻
1️⃣ 原因
你当前的 vcpkg 包(比如 libmysql、Boost 等)在编译时已经绑定了某个 SDK 版本(比如 MacOSX14.5.sdk)。这会导致:
• vcpkg 内部的 CMake 配置文件里硬编码了 SDK 路径:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk
• 如果系统升级了 Xcode 或 macOS SDK,旧路径就不存在,编译就会报错(找不到 libresolv.tbd、libdl.tbd 等)。
⸻
2️⃣ 为什么会出现这种情况
• vcpkg 默认会在 第一次构建时捕获环境中的 SDK,然后把路径写进 installed/arm64-osx/share/… 里的 *_targets.cmake 文件。
• 这些 cmake 文件里面的 INTERFACE_LINK_LIBRARIES 或 CMAKE_OSX_SYSROOT 都指向了旧 SDK。
• 之后即使你把 CMAKE_OSX_SYSROOT 改成新 SDK,vcpkg 的库仍然依赖旧路径。
⸻
3️⃣ 解决方法
方法 A:清理重装库
1. 删除整个 vcpkg 的 installed 目录(或针对 arm64-osx 清理):
rm -rf ~/vcpkg/installed/arm64-osx
2. 使用新 SDK 重新安装依赖:
./vcpkg install libmysql boost spdlog nlohmann-json redis-plus-plus curl
• 可在命令行加上指定 SDK:
cmake -DCMAKE_OSX_SYSROOT=$(xcrun —sdk macosx —show-sdk-path) …
方法 B:不绑定 SDK(更灵活)
• 安装时加上 VCPKG_FORCE_SYSTEM_BINARIES 或 VCPKG_CMAKE_SYSTEM_NAME,让 vcpkg 不硬编码 SDK。
• 或者使用 vcpkg 的 toolchain.cmake 在 CMake 中动态设置 SDK:
if(NOT DEFINED CMAKE_OSX_SYSROOT)
execute_process(
COMMAND xcrun —sdk macosx —show-sdk-path
OUTPUT_VARIABLE CMAKE_OSX_SYSROOT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
方法 C:升级 vcpkg port 文件
• vcpkg 的新版本有些 port 会自动适配新 SDK,尤其是常用库如 Boost、libmysql。
• 执行:
git pull
./vcpkg update
./vcpkg upgrade —no-dry-run
⸻
💡 总结
• 依赖旧 SDK 是 vcpkg 构建机制导致的,属于硬编码问题。
• 最稳妥的办法是 清理 installed 目录 + 用新 SDK 重新编译所有依赖。
• 如果想长期避免,每次 SDK 升级后都可以重装依赖,或者用上面动态获取 SDK 的方法。
⸻
我可以帮你写一个 macOS vcpkg 自动升级 SDK 并重装依赖的 bash 脚本,保证以后 SDK 升级后直接一键更新。
你希望我帮你写吗?
cmake -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.sdk ..
echo $CMAKE_OSX_SYSROOT
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.sdk
引用
- [1] vcpkg-github站点
- [2] 中文文档
- [3] vcpkg-库查询
- [4] https://vcpkg.io/en/index.html