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

使用colcon编译ROS2包时调用std::filesystem库遇编译错误求助

问题解决:ROS2编译std::filesystem时出现"filename is not a type name"错误

核心原因

你代码中错误地将std::filesystem::path::filename当作类型使用,但它实际上是std::filesystem::path类的成员函数,用于获取路径中的文件名部分,并非类型。

关于__cxx11命名空间的说明

__cxx11是GCC编译器为区分不同ABI(应用二进制接口)版本引入的内部命名空间,C17标准的std::filesystem实现会被嵌套在该命名空间下,但只要正确启用C17,编译器会自动处理,无需手动在代码中指定__cxx11。

解决步骤

1. 修正代码中的用法错误

将把filename当类型的错误代码,改为调用path对象的成员函数:

#include <filesystem>
#include <rclcpp/rclcpp.hpp>

namespace fs = std::filesystem;

int main(int argc, char** argv) {
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("filesystem_test_node");

    fs::path target_path("/home/user/test_file.txt");
    // 调用filename()成员函数获取文件名,而非定义类型
    auto file_name = target_path.filename();
    RCLCPP_INFO(node->get_logger(), "文件名: %s", file_name.c_str());

    rclcpp::shutdown();
    return 0;
}

2. 完善CMake配置,确保链接filesystem库

部分旧版本GCC(如GCC 8及更早)需要显式链接stdc++fs库,在你的包的CMakeLists.txt中,给目标添加链接库:

...
add_executable(你的节点名称 src/你的源文件.cpp)

ament_target_dependencies(你的节点名称
  rclcpp
)

# 添加这一行,链接stdc++fs库
target_link_libraries(你的节点名称
  PRIVATE
  stdc++fs
)

install(TARGETS
  你的节点名称
  DESTINATION lib/${PROJECT_NAME}
)
...

3. 无需使用std::experimental::filesystem

既然你已经配置了C17,直接使用标准的std::filesystem即可,实验版本的std::experimental::filesystem是C17之前的过渡方案,不适用于当前配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:50:01