使用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
相关产品推荐
相关产品推荐

