目录
前言
笔者这几天也在简单的学习现代C++23,这边也是听闻GCC出14.1了支持更好了,因此准备尝试以下使用GCC14玩玩C++23
下载最新的Mingw编译套件
如果看官没有特殊的需求,可以直接一步到位:
MSYS2: Mingw下载:Downloads - MinGW-w64可以进行挑选
放到一个位置上解压即可。
添加相关的环境变量引导后续我们构建程序的时候采用我们的GCC14.1的库:
添加最好,而且对于我这种的还要放在顶层先,防止链接错误的库导致程序行为诡异
(本人放到了D盘下的New Mingw目录,看官自行添加一个指向到bin目录的环境路径)
编写CMake引导使用GCC14.1
方法有很多,这里笔者简单的写了一个配置,看官酌情参考与修改:
cmake_minimum_required(VERSION 3.5.0) # 这里设置我们新添加的编译器,两种选择,一种在VSCode里锁定这个新的 # 编译套装,但是笔者这里只是临时体验,所以采用工程指定的方式 # CMAKE_C_COMPILER声明了要用到的C编译器 set(CMAKE_C_COMPILER "D:/New Mingw/bin/gcc.exe") # CMAKE_CXX_COMPILER声明了要用到的C++编译器 set(CMAKE_CXX_COMPILER "D:/New Mingw/bin/g++.exe") # 之后才能开始工程配置,这顺序不能搞错了 project(printDemo VERSION 0.1.0 LANGUAGES C CXX) # 指定使用C++23 + 调试符号保留 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++23") add_executable(printDemo main.cpp) # 先别急这个事情,之后我会说 # target_link_libraries(printDemo "D:/New Mingw/lib/libstdc++exp.a")
很简短的CMakeLists,下面我们来看看主文件:
#include <chrono> #include <iostream> #include <print> int main() { auto text = std::format("{0} hex is {0:08X}", 42); auto now = std::chrono::system_clock::now(); auto date = std::format("Today is {:%Y-%m-%d}", now); std::cout << date << '\n'; }
我们编译项目,有一定概率翻车:
undefined reference to `std::__write_to_terminal(void*, std::span<char, 18446744073709551615ull>)'
我们需要去:GCC 14 Release Series — Changes, New Features, and Fixes - GNU Project,然后会注意到这一行:
std::print and std::println (requires linking with -lstdc++exp on Windows).
这下看懂了:
target_link_libraries(printDemo "D:/New Mingw/lib/libstdc++exp.a")
之后项目就可以通过编译。但是运行上可能还会出现找不到库的问题,所以这就是为什么我要在一开始有要求添加环境变量了,省事。不过,当你添加了这块变量,可能就不需要
target_link_libraries(printDemo "D:/New Mingw/lib/libstdc++exp.a")
了,这是因为搜索路径已经包含了,(我说怎么ld这么久)
现在欢乐的运行程序
➜ .\printDemo.exe Today is 2024-07-27
完事。