You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ spdlog使用~开头路径报错无法打开日志文件原因是什么

核心原因

波浪号~的路径展开是Shell(比如bash、zsh)的专属特性,只有在Shell终端中执行命令时,Shell才会自动将路径开头的~替换为当前用户的家目录(对应HOME环境变量的值)的绝对路径。
spdlog的文件操作底层直接调用操作系统的文件接口,C/C++标准库和系统原生的文件open调用都没有内置波浪号展开的逻辑,会直接把~当成普通的目录名称,尝试在程序的当前工作目录下查找名为~的子目录,自然会触发「文件或目录不存在」的报错。

为什么其他路径写法正常

你测试的两类路径本身不需要Shell做预解析,系统调用可以直接识别:

  • 相对路径logs/log.txt会基于程序运行时的当前工作目录(你这里是~/project/build/)拼接寻址
  • 绝对路径/home/user/logs/log.txt是完整的路径寻址标识,不需要额外转换
解决方案

可以选择以下任意一种方式处理:

  • 手动拼接家目录路径,通过getenv("HOME")获取当前用户家目录的绝对路径,再和后续日志路径拼接后传给spdlog,示例代码如下:
#include <cstdlib>
#include <string>

// 实际调用前建议增加HOME环境变量存在性判断
std::string home_dir = getenv("HOME");
std::string log_full_path = home_dir + "/logs/log.txt";
auto logger = spdlog::rotating_logger_mt("runtime_log", log_full_path, max_size, max_files);
  • 直接使用提前确认好的绝对路径,或者适配程序运行场景的相对路径即可。

内容的提问来源于stack exchange,提问作者Charkrit_A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:27:00