新版本 GCC / LLVM 安装
安装版本更新时间:2025-05-06 gcc(15.1) / llvm(20.1.5) 依赖 各种系统缺失的依赖组件不尽相同,常见容易缺失的组件可以考虑下面安装命令: yum install -y doxygen libxml2-devel swig python3-devel cmake ninja-build 安装 GCC 注意参考当前系统 GCC 编译选项 gcc -v 并进行简单调整: 确认 multilib 的启用状态; 确认 unwind-exception 的启用状态; 确认 arch_32 架构相关参数; 去除如 bugurl 等无关参数; wget https://ftp.gnu.org/gnu/gcc/gcc-15.1.0/gcc-15.1.0.tar.xz tar xf gcc-15.1.0.tar.xz cd gcc-15.1.0 ./contrib/download_prerequisites # 下载依赖组件 mkdir stage cd stage ../configure --enable-bootstrap --enable-languages=c,c++,lto --prefix=/data/server/compiler --enable-shared --enable-threads=posix --enable-checking=release --disable-multilib --with-system-zlib --enable-__cxa_atexit --enable-gnu-unique-object --enable-linker-build-id --enable-libstdcxx-backtrace --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --without-isl --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=i686 --with-build-config=bootstrap-lto --enable-link-serialization=1 make -j8 make install 若下载依赖组件步骤出现问题或极其缓慢可考虑寻找镜像地址自行下载对应版本:
常用 WEZTERM 配置
使用 WezTerm 配合 XPIPE 集成控制你的资源; 参考 Configurations 调整文件 .wezterm.lua(位于用户目录)文件: local wezterm = require 'wezterm' local config = wezterm.config_builder() -- 顶部 TABBAR 配置 -- 融合 TITLEBAR 与 TABBAR 并配置字体 config.window_decorations = "INTEGRATED_BUTTONS|RESIZE" config.window_frame = { font = wezterm.font('Maple Mono NF CN'), font_size = 14.0 } -- 样式字体 config.color_scheme = 'Vs Code Light+ (Gogh)' config.font = wezterm.font('Maple Mono NF CN') config.font_size = 14.0 -- 补充按键映射 config.keys = { { mods = '', key = 'Home', action = wezterm.action{ SendString = '\001' }}, { mods = '', key = 'End', action = wezterm.action{ SendString = '\005' }} } return config
GDB 安装并 PRETTYPRINT 支持
安装版本更新时间:2025-04-29 gdb(16.3) 配合 gcc(15.1) 启用 Pretty Print 可方便在基于 GDB 的调试能够更直观的查看标准库内的结构,如字符串、向量、列表等; 一般系统默认的 GCC/G++ 安装已能正常工作;在升级安装多个 GCC 版本时,可参考如下流程配置: 安装 GCC/LLVM 请参考 新版本 GCC/LLVM 安装 依赖组件(依赖 python 支持支持 PrettyPrint 功能) yum install -y python3-devel gmp-devel mpfr-devel ncurses-devel 下载 GDB 编译安装: 镜像列表:https://www.gnu.org/prep/ftp.html#gnu_mirror_list wget https://ftp.gnu.org/gnu/gdb/gdb-16.3.tar.xz tar xf gdb-16.3.tar.xz cd gdb-16.3 mkdir stage cd stage CC=/data/server/compiler/bin/gcc CXX=/data/server/compiler/bin/g++ ../configure --prefix=/data/server/compiler --with-python=/usr/bin/python3 make -j8 make install 启用 Pretty Print 支持 编辑 ~/.gdbinit 文件并填写下述内容: python import sys # 注意确认路径文件版本 sys.path.insert(0, '/data/server/compiler/share/gcc-15.1.0/python') end # 注意确认路径文件版本 source /data/server/compiler/lib64/libstdc++.so.6.0.34-gdb.py
使用 VSCODE 配合 LLDB 进行调试
通过搜索一般得到的推荐是安装额外的插件:https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb 这里提供另外一种形式,通过安装 llvm-mi 支持 cppdbg 实现; 问题 一般通过 launch.json 配置: { ... "MIMode": "lldb", "miDebuggerPath": "/data/server/compiler/bin/lldb", ... } 启动调试时会发生错误: error: unknown option: --interpreter=mi error: unknown option: --tty=/dev/pts/1 Use 'lldb --help' for a complete list of options. 解决 在已经安装了 lldb 后,还需要额外编译安装 lldb-mi 组件(不是标准 llvm-projects 的一部分),:https://github.com/lldb-tools/lldb-mi wget -O lldb-mi-main.zip https://github.com/lldb-tools/lldb-mi/archive/refs/heads/main.zip unzip lldb-mi-main.zip cd lldb-mi-main/ mkdir stage cd stage CC=/data/server/compiler/bin/clang CXX=/data/server/compiler/bin/clang++ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/data/server/compiler -DCMAKE_PREFIX_PATH=/data/server/compiler ../ make -j8 make install 注意: -DCMAKE_PREFIX_PATH=/data/server/compiler 指定依赖的 lldb 安装路径(参考 新版本 GCC / LLVM 安装 安装) -DCMAKE_INSTALL_PREFIX=/data/server/compiler 合并安装; 并调整配置:
C++ 功能演示
format - https://godbolt.org/z/6rxG4zoaj 从 C 集成的 printf 和 C++ 定义的类型安全的 iostream 复杂实现,均存在一些各自的缺陷和问题,在 C++20 中加入的 format 实现(基于 fmt 库)集合了前两者的优势; https://fmt.dev/latest/index.html (<=C++17) spaceship operator <=> - https://godbolt.org/z/5797fKdhW 大幅的减少了需要重载的比较运算符;编译器会自动根据 <=> 生成实际比较运算的代码; coroutine - https://godbolt.org/z/YcG8M4fzG 原生协程支持,有较高的自由度进行定制; pipe operator - https://godbolt.org/z/GbfsKesaM 直观使用 operator | 形态表达一个处理流程(配合 outcome::result 错误处理); proxy - https://godbolt.org/z/6oM34ePrz 微软 Proxy 库新形态的“多态”机制; return value optimization - https://godbolt.org/z/57W1sWrsP 返回值优化机制及可能的特例演示;
安装和配置 OH-MY-BASH
虽然出现了很多 bash 的替代品,但在 linux 下默认的 shell 依然还是 bash 简单配置下还是不错的; https://github.com/ohmybash/oh-my-bash/ 安装 bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" 选项 文件覆盖: # ~/.oh-my-bash/lib/shopt.sh set -o noclobber 24小时制: # ~/.oh-my-bash/themes/font/font.theme.sh THEME_CLOCK_FORMAT=${THEME_CLOCK_FORMAT:-"%H:%M:%S"} 更新 cd ~/.oh-my-bash git stash # 保存变更 git pull # 更新对齐 git stash pop # 个人变更
GO 远程 DELVE 调试缓慢问题
在双方机器安装调试工具 go install github.com/go-delve/delve/cmd/dlv@latest 配置环境变量: export PATH=$PATH:$GOPATH/bin 在远程机器启动对应服务: dlv --listen :33333 --api-version=2 --headless --accept-multiclient --allow-non-terminal-interactive exec {program-to-run} -- {program-args} 在 vscode 中进行类似配置进行远程调试: { "version": "0.2.0", "configurations": [ { "name": "remote-debug", "type": "go", "request": "attach", "mode": "remote", "host": "{address-to-remote-server}", "port": 33333, "debugAdapter": "dlv-dap", // 适配器 "substitutePath": [ // 源代码路径映射 { "from":"${workspaceFolder}", "to":"{remote-source-folder}, } ] } ] } 注意:适配器配置可能导致调试极其缓慢的问题,参考: https://github.com/golang/vscode-go/releases/tag/v0.41.3 "debugAdapter": "dlv-dap"
FLATPAK 安装 FCITX5 输入漏字母问题
安装 flatpak 对应包 fcitx5 及相关 optional addon 如 fcitx5-rime 后,按教程配置对应环境变量: 可以考虑配置在 /etc/environment 中: # /etc/environment LANG="zh_CN.UTF-8" QT_IM_MODULE=fcitx GTK_IM_MODULE=fcitx XMODIFERS="@im=fcitx" 上述过程后还出了无法在 Chrome/Vscode 中输入或漏字母问题;后几经查证,由于输入发对应应用需要加载 fcitx5-frontend-* 相关插件才能正确完成输入;但对应组件需要与对应应用处于同环境,而无法通过 flatpak 安装(隔离的运行环境)故: apt install fcitx5-frontend-* 解决了问题; 参考: github.com/fcitx/fcitx5
GITHUB 腾讯镜像访问
地址映射:https://mirrors.tencent.com/github.com/{group}/{repo}/ 参考以下示例: 用户:https://mirrors.tencent.com/github.com/terrywh 项目:https://mirrors.tencent.com/github.com/github.com/clash-verge-rev/clash-verge-rev 发布:https://mirrors.tencent.com/github.com/kingToolbox/WindTerm/releases 注意: 由于实际映射地址中的链接并未进行变更,会发生跳转回 github.com 或 404 not found 的情况;
避免内存拷贝的字符串与字节串互转(GO)
正常强制转换: func s2b(s string) []byte { return []byte(s) } func b2s(b []byte) string { return string(b) } 避免内存拷贝: func s2b(s string) (b []byte) { /* #nosec G103 */ bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) /* #nosec G103 */ sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) bh.Data = sh.Data bh.Cap = sh.Len bh.Len = sh.Len return b } func b2s(b []byte) string { /* #nosec G103 */ return *(*string)(unsafe.Pointer(&b)) }