下载 Visual Studio

https://visualstudio.microsoft.com/zh-hans/downloads/

安装 Visual Studio

通常选择:

  • 使用 C++ 的桌面开发

目录调整

默认安装在C目录,如果空间不够用,可以调整到其它目录

# 1、先移动目录其它的盘符,示例为E盘
C:\Program Files\Microsoft Visual Studio
C:\Program Files (x86)\Microsoft SDKs
C:\Program Files (x86)\Microsoft Visual Studio
C:\Program Files (x86)\Windows Kits
C:\ProgramData\Microsoft\VisualStudio
C:\ProgramData\Package Cache

# 2、创建软连接
mklink /d "C:\Program Files\Microsoft Visual Studio" "E:\Program Files\Microsoft Visual Studio"
mklink /d "C:\Program Files (x86)\Microsoft SDKs" "E:\Program Files (x86)\Microsoft SDKs"
mklink /d "C:\Program Files (x86)\Microsoft Visual Studio" "E:\Program Files (x86)\Microsoft Visual Studio"
mklink /d "C:\Program Files (x86)\Windows Kits" "E:\Program Files (x86)\Windows Kits"
mklink /d "C:\ProgramData\Microsoft\VisualStudio" "E:\ProgramData\Microsoft\VisualStudio"
mklink /d "C:\ProgramData\Package Cache" "E:\ProgramData\Package Cache"

C++ 包管理工具

使用文档:https://github.com/microsoft/vcpkg/blob/master/README_zh_CN.md

Visual Studio的三方依赖包管理很麻烦,vcpkg解决了这个痛点

vcpkg:自动编译安装C/C++包,并自动解决依赖包编译问题

安装

# 建议放置到根目录:E:\vcpkg
# 建议您使用例如 C:\src\vcpkg 或 C:\dev\vcpkg 的安装目录,否则您可能遇到某些库构建系统的路径问题
git clone https://github.com/microsoft/vcpkg vcpkg-init

# 基础包环境准备
# 模板(主要是网速不给力):git clone https://github.com/microsoft/vcpkg vcpkg-init
# 进入 vcpkg-init 目录,下载 vcpkg.exe (或者对应其它平台的执行文件)
.\bootstrap-vcpkg.bat # 如果下载失败,可以手动下载拷贝到当前目录,这条命令只是用于下载管理命令

# 安装基础包 fmt,会自动安装依赖包:cmake、PowerShell到:~\downloads\tools
# 也可以添加参数:--only-downloads 用于只下载,这里cmake、PowerShell还是会被安装
# github下载慢,可以手动下载到对应目录
.\vcpkg install fmt:x64-windows-static --only-downloads
# 依赖包全部下载完成再安装
.\vcpkg install fmt:x64-windows-static
# 查看安装包
.\vcpkg list


# 复制基础包给其它项目使用
vcpkg-init -> test

# PS:如果打算将此 vcpkg 目录作为全局使用,可以将 vcpkg.exe 添加到系统路径
# 相对目录:~\vcpkg.exe

集成到全局

根据需求是否使用此方案:集成vcpkg.exe到vs全局

# 集成vcpkg.exe到vs全局
.\vcpkg integrate install
# 编译的时候增加参数即可
# CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/test/scripts/buildsystems/vcpkg.cmake"

# 删除集成
.\vcpkg integrate remove

集成到项目

  1. vcpkg.exe 模拟一个 NuGet 的本地源 (.\vcpkg integrate project)
  2. “NuGet 包管理器 ” 添加 vcpkg.exe 模拟的“源” (对应关联路径:~\scripts\buildsystems)
  3. 不同项目可以选择不同的源 (不同的源可能是依赖包版本不同、项目依赖包列表不同等)
.\vcpkg integrate project

#################### 重要:NuGet 添加本地源 ####################
# 工具 - NuGet 包管理器 - 程序包源 - 新增 - 源(为下面的路径)
# 推荐名称:vcpkg.E.vcpkg.test
# 路径:E:\Users\Administrator\Visual Studio\vcpkg\test\scripts\buildsystems
# 下面是执行 vcpkg integrate project 后 生成的提醒日志
With a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:
    Install-Package vcpkg.E.vcpkg.test -Source "E:\vcpkg\test\scripts\buildsystems"

安装依赖库

根据项目需求安装相关架构的包

https://vcpkg.io/en/packages.html

c++ 之动态库与静态库区别

# x64 依赖包
# .\vcpkg install fmt:x64-windows-static
# .\vcpkg install openssl:x64-windows-static

# x86 依赖包
# .\vcpkg install fmt:x86-windows-static
# .\vcpkg install openssl:x86-windows-static

# 动态库
# 如果要打包给其它人使用,需要静态包,否则相关dll不会被打入包
# .\vcpkg install fmt:x64-windows

测试三方包

基于:NuGet 包管理器 测试

创建测试项目

  • 打开vs-创建新项目-空项目
  • 项目名称:HelloWorld
  • 勾选:将解决方案和项目放在同一目录

添加源

  • 参考:集成到项目
  • 右击项目 -> “管理 NuGet 程序包”
  • 程序包源 :vcpkg.E.vcpkg.test
  • 点击 浏览 -> 选择 “vcpkg.E.vcpkg.test”(多虚拟环境也就实现了) - 安装
  • 安装包保存在:~\HelloWorld\packages\vcpkg.E.vcpkg.test.1.0.0

调整解决方案

  • 右击项目 - 属性 - 配置属性 - vcpkg - Use Static Libraries - 改成: 是
  • 右击项目 - 属性 - 配置属性 - C/C++- 代码生成 - 运行库
    • Release 模式选择: 多线程(/MT)
    • Debug 模式选择: 多线程调试(/MTd)

自带hello world

外部依赖项:正常加载, 因为 vcpkg 的 Use Static Libraries 默认继承父类

源文件 - 添加 - 新建项 - main.cpp

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}

三方hello world

测试三方包:.\vcpkg install fmt:x64-windows-static

外部依赖项:无法正常加载??? 因为 vcpkg 的 Use Static Libraries 默认没有使用静态库

#include <fmt/core.h>

int main() {
  fmt::print("Hello, world!\n");
}

CMake详解

经典库

boost

Visual Studio 集成 boost 比较简单,参考:https://blog.csdn.net/loongsking/article/details/80136004

以下是基于:linux + vs code 测试

  • boost(C++程序库的总称)

  • 安装boost

    # linux环境预处理:指定安装路径:相关路径会写入到:project-config.jam和编译生成b2命令
    ./bootstrap.sh --prefix=/usr/local/boost
    # b2生成include和lib,并安装到:/usr/local/boost
    ./b2 install
    
  • 测试

    • main.cpp

      #include <boost/lambda/lambda.hpp>
      #include <iostream>
      #include <iterator>
      #include <algorithm>
      
      int main()
      {
          using namespace boost::lambda;
          typedef std::istream_iterator<int> in;
      
          std::for_each(
              in(std::cin), in(), std::cout << (_1 * 3) << " ");
      }
      
    • CMakeLists.txt

      cmake_minimum_required(VERSION 3.0.0)
      project(zaza VERSION 0.1.0)
      
      # debug模式
      set(Boost_DEBUG ON)
      
      include(CTest)
      enable_testing()
      
      # 指定源码也可以使用(适用于本地开发并编译)
      # 等价于:cmake ../ -DBOOST_ROOT=/mnt/e/boost_1_79_0
      SET (BOOST_ROOT "/mnt/e/boost_1_79_0")
      
      # 引用线上编译安装的版本
      # 等价于:cmake ../ -DBOOST_INCLUDEDIR=/usr/local/boost/include -DBOOST_LIBRARYDIR=/usr/local/boost/lib
      # 也可以设置单独的根目录:SET (BOOST_ROOT "/usr/local/src/boost")
      # SET (BOOST_INCLUDEDIR "/usr/local/boost/include")
      # SET (BOOST_LIBRARYDIR "/usr/local/boost/lib")
      
      # 定义版本号
      SET (BOOST_MIN_VERSION "1.79.0")
      # 等价于:cmake ../ -DBoost_NO_BOOST_CMAKE=BOOL:ON 
      # set (Boost_NO_BOOST_CMAKE ON)   # cmake的忽略系统BoostConfig.cmake
      # Boost 版本限制
      FIND_PACKAGE(Boost ${BOOST_MIN_VERSION} REQUIRED)
      
      if(Boost_FOUND)
          # 添加include的目录,否则报hpp文件无法找到
          include_directories(${Boost_INCLUDE_DIRS})
          # MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
          # MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
          # MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
      
          # 定义生成的执行文件为:zaza
          add_executable(zaza main.cpp)
          # 为生成的目标文件添加头文件
          target_link_libraries (zaza ${Boost_LIBRARIES})
      endif()
      
      set(CPACK_PROJECT_NAME ${PROJECT_NAME})
      set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
      include(CPack)
      
    • 编译、运行

      # 建议单独添加目录编译
      mkdir build && cd build && cmake ../ && make
      # 测试
      echo 1 2 3 | ./zaza
      

常见问题

  • 加载vspkg库失败 通过命令 .\vcpkg install fmt:x64-windows-static 安装库后,代码无法正常使用库 原因:因为vcpkg 默认使用动态库,而上面安装的是静态库 解决方案:右击项目 - 属性 - 配置属性 - vcpkg - Use Static Libraries - 改成 是

  • LNK2038 检测到“RuntimeLibrary”的不匹配项 https://blog.csdn.net/xingkongfenqi/article/details/49180075 Release 改成:多线程(/MT) 对应的是MD_StaticRelease Debug 改成: 多线程调试(/MTd)