一直以来,笔者都认为在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 <package>
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)
安装完成后,相应的头文件、库文件和vcpkg/installed/x64-windows
文件夹。
其他常用命令:
列出已安装的package
vcpkg list
可移除指定的package
vcpkg remove
注意:如果将vcpkg作为项目的子模块使用,则不需要添加环境变量
找到此电脑
,右键属性
,找到高级系统设置
->环境变量
,在Path
变量中添加值C:\vcpkg
即可。然后在任意位置打开一个命令行,输入vcpkg version
,如果返回vcpkg版本,则表明环境变量设置成功。这时候就可以在任意位置使用vcpkg命令了。
运行如下命令:
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)
在vscode中也可以通过在.vscode/settings.json
中添加以下代码来设置:
"cmake.configureArgs": ["-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake"]
新建一个文件夹,创建一个空的CMakeLists.txt
文件,用vs2022打开该文件夹,vs会自动识别这是个cmake工程,然后进行配置。在vs中创建main.cpp
,继续以ceres
库为例,在main.cpp中添加以下程序(来源):
#include
#include
class CostFunc {
public:
CostFunc() = default;
template<typename T>
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<CostFunc, 1, 1>(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就会对程序进行编译、运行
运行后结果如下,表明运行成功
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快速使用教程