Ubuntu+VSCode环境下仅通过vcpkg引入指定库的CMake配置疑问
用vcpkg在Ubuntu+VSCode中管理依赖的完整流程
一、实现vcpkg的项目级迁移(类npm install效果)
你已经将vcpkg安装在项目内,只需两步就能让项目迁移后无需重新执行安装命令:
- 在项目根目录创建
vcpkg.json,明确依赖列表:
{ "name": "your-project-name", "version-string": "0.1.0", "dependencies": [ "assimp", "imgui", "glfw3", "glad" ] }
- 迁移时直接打包整个项目文件夹(包含vcpkg目录和vcpkg.json),后续只需配置CMake指定toolchain,vcpkg会自动完成依赖安装。
二、拆解你困惑的CMake指令
先明确各指令的核心作用,避免混乱:
find_package(XXX REQUIRED):CMake标准查找逻辑,优先读取库的CMake配置文件(如XXXConfig.cmake)找到库的头文件、库文件路径。未指定vcpkg toolchain时,会优先搜索系统目录。find_library(XXX_LIBRARY XXX):底层查找逻辑,直接定位编译好的库文件(如libXXX.so),适合无CMake配置文件的库,但灵活性远低于find_package。include_directories():全局添加头文件路径,所有编译目标都会生效,容易引发路径冲突,不推荐。target_include_directories():为特定编译目标添加头文件路径,是现代CMake的推荐写法,精准可控。target_link_libraries():将库链接到目标可执行文件/库,这是最终生效步骤,但前提是CMake已正确找到依赖库。
三、关键:让CMake优先使用vcpkg的库
要让find_package从项目内的vcpkg查找库,必须指定vcpkg的toolchain文件,两种配置方式:
- VSCode自动配置:在
.vscode/settings.json中添加:
{ "cmake.configureSettings": { "CMAKE_TOOLCHAIN_FILE": "${workspaceFolder}/vcpkg/scripts/buildsystems/vcpkg.cmake" } }
后续VSCode运行CMake配置时,会自动加载该toolchain,无需手动输入参数。
2. 终端手动配置:执行CMake时添加参数:
cmake -B build -DCMAKE_TOOLCHAIN_FILE=./vcpkg/scripts/buildsystems/vcpkg.cmake
四、针对你的依赖的具体CMakeLists.txt写法
直接复制以下代码到项目根目录的CMakeLists.txt,替换your-project-name和your-executable为你的项目名和可执行文件名:
cmake_minimum_required(VERSION 3.20) project(your-project-name) # 设置C++标准 set(CMAKE_CXX_STANDARD 17) # 查找依赖库 find_package(assimp REQUIRED) find_package(glfw3 REQUIRED) find_package(glad REQUIRED) find_package(imgui REQUIRED) # OpenGL为系统自带库,直接用find_package即可,vcpkg不会覆盖系统OpenGL find_package(OpenGL REQUIRED) # 添加可执行目标 add_executable(your-executable src/main.cpp) # 链接所有依赖(自动处理头文件路径,无需额外配置) target_link_libraries(your-executable PRIVATE assimp::assimp glfw glad::glad imgui::imgui OpenGL::GL )
说明:
- vcpkg安装的库会生成对应的命名目标(如
assimp::assimp),这些目标已包含头文件路径和库文件路径,无需手动添加target_include_directories。 PRIVATE表示依赖仅作用于当前可执行目标,不会传递给其他依赖该目标的库,符合现代CMake规范。
五、验证依赖是否生效
配置完成后,运行CMake配置并编译项目。可检查build目录下的CMakeCache.txt,搜索assimp_DIR,若指向项目内vcpkg的安装路径(而非系统目录),则说明配置成功。
内容的提问来源于stack exchange,提问作者deepfreeze
相关产品推荐
相关产品推荐

