C++环境配置和简单使用
前言
本文更新了针对其它编辑器/IDE 的配置方式,可见详细配置。
本文可能更适合需要更高需求的学生(例如需要调用某个包),对于普通的学生而言,默认情况下的 Visual Studio 已经够用了。
本文将在两类操作系统上进行试验,其中可能会有间接宣传。
Windows
使用 msvc(Visual Studio)工具链
安装
直接前往官网下载即可。
vcpkg
对于一些需要使用第三方库(尤其是非仅头文件库)的学生,我建议尝试一下vcpkg(反正也是本地编译)。
参考安装进行安装(可能需要先下载 git)。 然后在 Visual Studio 进行配置即可。
使用 GNU 工具链
安装
笔者推荐直接使用msys2环境而不是单独下载编译器等内容,因为其中附带了一些工具,可以直接进行使用。
笔者未尝试过直接在官网下载,相反,可以在开源镜像站进行下载,速度可能会比官网快些。
使用
选择
可以根据自己的情况酌情使用下面的几个工具链,笔者推荐UCRT64的。
为啥不推荐使用MINGW64的?因为这个链接的运行时库太老了,老到什么程度呢?甚至不能直接用
setlocale将语言编码设置成 UTF-8。 UCRT64的直接就能链接到新的 ucrt 库,这个库在现在的微软官网是有文档的,直接查询相关函数就能搜到。安装包
msys2 使用
pacmam包管理器(和 Arch Linux)的一样,因此如果想查阅命令的相关用法,可以参考这里。不过需要用的命令可能比较少,以下是一些举例:
pacman -Ss搜索包pacman -Sy 包名安装包pacman -Syu升级包pacman -R卸载包
因为这些工具链是共用一个包管理的,所以在安装某个对应工具链的包时需要加上“前缀”,例如
mingw-w64-ucrt-x86_64,搜索包时后面也会标明。设置环境变量
特别警告:不要将 msys 的目录放进 PATH 中,会导致系统错乱!
这一步是可选的,如果希望能调用到某个工具链的命令,可以将其的可执行目录加入到环境变量的
PATH中。例如C:\msys64\ucrt64\bin。编译第一个程序
这边建议配合一个有插件功能的编辑器(例如
vscode)或集成开发环境(例如CLion)使用。(最好配合语言服务器使用,一般使用的是clangd)编译程序首先需要编译器,可以使用
gcc或者clang,按上述教程安装,然后尝试gcc(或clang) 文件名 -o 输出文件编译。如果需要使用构建程序,最好是直接在工具链中安装并使用工具链提供的,最好不要自行在官网下载。
打包
其实我也不太会,不过笔者之前找了个 deploy 脚本,可以试试:
deplist=$( ldd $1 | awk '{if (match($3,"/ucrt64")){ print $3}}' )
cp -L -n $deplist $2Linux
首先明白自己的发行版和包管理器,然后安装好编译器(gcc或clang)。编译流程可以参考上文“编译第一个程序”。
详细配置
LSP (语言服务器)
刚刚笔者在新版的vscode上尝试,默认情况下的Intellisense已经足够可用了。但是如果你习惯了其它的 LSP,可以试着在扩展商城中下载。
一般情况下会检查环境变量PATH下是否有clangd,然后才会提示是否要下载最新版。你也可以选择在上面下载,也可以自己下然后在扩展的配置界面中自行配置。
CLion中的clangd似乎只能使用内置的,没法修改。
其它的编辑器可能需要修改自己的settings.json或者某些自定义文件才可以使用(笔者遇到过默认配置的qml服务器是不能用的,因为文件名不太一样),这种请自行参阅文档。
CMake
一般要搭配环境自带的(如果可以)CMake 使用,或者也可以用外置的,但是可能需要指定PATH等环境变量。
例如CLion中可以自行修改工具链,同样也可以修改环境变量。(笔者之前尝试的似乎是如果直接使用MSYS2 UCRT64中的 CMake,不需要修改环境变量也可以使用其中的命令、工具链等,但是也是可以自行配置的)
这里顺便写个简单的CMakeLists.txt,供初学者使用。(代码自己脑补去,再写就太复杂了)
# 不写会警告,最低版本需求
cmake_minimum_required(VERSION 3.17)
# 给项目命名,增加语言
project(test LANGUAGES C CXX)
# 使用pkg-config实现寻找库,当然如果工具链有其他包改成对应名字即可
# 至于会产生的变量参见网络文档
# 一般是${PKG_FOUND}, ${PKG_LIBRARIES}之类的
find_package(PkgConfig)
# 使用PkgConfig寻找包,还能设置别名
pkg_search_module(GLIB REQUIRED glib-2.0)
# 生成库(如果没指定类型就是静态,这里指定一下)
# 如果没指定而需要生成动态需要把BUILD_SHARED_LIBS设成ON
add_library(test_core SHARED core.c)
# 给目标链接库
target_link_libraries(test_core PUBLIC ${GLIB_LIBRARIES})
# 添加包含目录(视库的情况,有的库在find_package时似乎就会默认加进来,可能不需要自己加)
target_include_directories(test_core PUBLIC ${GLIB_INCLUDE_DIRS})
# 生成可执行文件
add_executable(test test.c)
target_link_libraries(test PUBLIC test_core)

