一直以来,本人都认为在windows中使用cmake开发C++是一件很难搞的事,windows不像linux那样能方便地对各种C++软件包进行管理,直到发现了vcpkg这个包管理器,才终于使我的windows C++开发体验好了起来。
本文使用vcpkg作为包管理器,cmake作为项目的构建工具,在VS2022/VSCode等IDE或编辑器上搭建C++开发环境。
软件环境-
Windows 10
-
Git
-
Visual Studio 2022 / Visual Studio Code
-
CMake(optional,VS2022自带cmake)
可以将vcpkg下载到任何位置,一般有两种选择,第一种是将vcpkg作为cmake工程的子模块,将其下载到cmake项目下;第二种是将vcpkg下载到其他位置,添加环境变量,作为全局的包管理器。
本文选择第二种方式
首先选择一个位置下载vcpkg,本文选择直接装在C盘下c:/,在该路径打开Git Bash或者Powershell,使用Git克隆
git clone https://github.com/microsoft/vcpkg ./vcpkg/bootstrap-vcpkg.bat
使用以下命令安装所需要的库:
./vcpkg/vcpkg install
vcpkg在Windows中默认安装的是x86版本的库,如果要x64版本的库,则需要添加后缀x64-windows,以安装x64版本的ceres-solver为例,命令如下:
./vcpkg/vcpkg install ceres:x64-windows
然后vcpkg就会下载ceres的源程序,以及ceres的依赖项(如Eigen3、glog、gflags等),然后编译安装,编译时间比较长,安装成功后会返回以下字段,可以在CMakeLists.txt中加入这些代码来添加ceres依赖
ceres provides CMake targets:
# this is heuristically generated, and may not be correct
find_package(Ceres CONFIG REQUIRED)
target_link_libraries(main PRIVATE ceres Ceres::ceres)
安装完成后,相应的头文件、库文件和
其他常用命令:
-
列出已安装的package
vcpkg list
-
可移除指定的package
vcpkg remove
注意:如果将vcpkg作为项目的子模块使用,则不需要添加环境变量
找到此电脑,右键属性,找到高级系统设置->环境变量,在Path变量中添加值C:vcpkg即可。然后在任意位置打开一个命令行,输入vcpkg version,如果返回vcpkg版本,则表明环境变量设置成功。这时候就可以在任意位置使用vcpkg命令了。
在VS中使用运行如下命令:
vcpkg integrate install
执行后会返回:
Applied user-wide integration for this vcpkg root. All MSBuild C++ projects can now #include any installed libraries. Linking will be handled automatically. Installing new libraries will make them instantly available. CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake"
表示在执行完这个命令后,在VS中的非cmake项目可以直接使用#include包含所需要的库的头文件,在链接环节,也会自动的链接到所安装的库。如果是cmake项目的话,还需要添加cmake选项-DCMAKE_TOOLCHAIN_FILE=
cmake .. -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
如果不在命令行中添加cmake选项,就要在CMakeLists.txt中第一个project()前设置cmake工具链:
set(CMAKE_TOOLCHAIN_FILE C:/vcpkg/scripts/buildsystems/vcpkg.cmake)CMake工程示例
新建一个文件夹,创建一个空的CMakeLists.txt文件,用vs2022打开该文件夹,vs会自动识别这是个cmake工程,然后进行配置。在vs中创建main.cpp,继续以ceres库为例,在main.cpp中添加以下程序(来源):
#include#include class CostFunc { public: CostFunc() = default; template bool operator()(const T* x, T* residual) const { *residual = 0.5 * pow(T(10.0) - *x, 2); return true; } }; int main(int argc, char** argv) { ceres::Problem problem; double x = 9.0; ceres::CostFunction* cost_function = new ceres::AutoDiffCostFunction (new CostFunc); problem.AddResidualBlock(cost_function, nullptr, &x ); ceres::Solver::Options options; options.linear_solver_type = ceres::DENSE_QR; options.minimizer_progress_to_stdout = true; ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); std::cout << summary.BriefReport() << std::endl; std::cout << "result: " << x << std::endl; }
在CMakeLists.txt中添加以下代码,再次强调CMAKE_TOOLCHAIN_FILE必须在第一个project()之前设置
cmake_minimum_required(VERSION 3.0.4)
set(CMAKE_TOOLCHAIN_FILE C:/vcpkg/scripts/buildsystems/vcpkg.cmake)
project(cmake_test)
# 寻找依赖项
find_package(Ceres CONFIG REQUIRED)
# 添加头文件路径
include_directories(include ${CERES_INCLUDE_DIRS})
# 生成可执行文件
add_executable(main src/main.cpp)
# 添加链接库
target_link_libraries(main ${CERES_LIBRARIES})
保存后,vs会自动更新cmake项目配置,然后启动程序,VS就会对程序进行编译、运行
运行后结果如下,表明运行成功
在VSCode中使用CMakeLists.txt和main.cpp与前文一致,用VSCode打开文件夹,下方配置栏设置如下:
如果使用的是另外安装的cmake(不是vs2022自带的cmake),则要确保cmake版本在3.21以上,否则会报以下错误:
CMake Error: Could not create named generator Visual Studio 17 2022
这是因为老版本的cmake还不支持Visual Studio 17 2022这个Generator,点击CMake Latest Release地址下载安装最新版cmake即可。参考
附录vcpkg瘦身:在使用vcpkg一段时间后,会发现它占用了很大的磁盘空间
可以将vcpkg中的package、buildtrees、downloads这三个文件夹删除,其中package是不同软件包之间用于暂存的内部文件夹,buildtrees是编译软件包时使用的目录,这也是最占空间的文件夹,downloads保存已下载的软件包源代码或者工具。这三个文件夹都可以删除,删除后占用空间会大大减少。
vcpkg总览
CMake—优雅地构建软件项目实践
vcpkg快速使用教程



