glog/log_severity.h :找不到

博客提及 glog/log_severity.h 找不到的情况,但未给出具体内容。推测可能围绕该文件缺失的原因、解决办法等信息技术相关问题展开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

vs2017添加了GLOG_NO_ABBREVIATED_SEVERITIES还是没用,后来去githup问题中也没找到;
问题解决:cmake是默认的,不在build的头文件,src下面,  干!!把他copy到你项目的include下面就好了

在这里插入图片描述

#include <iostream> #include <fstream> #include <vector> #include <Eigen/Core> #include <Eigen/Geometry> #include <g2o/core/base_vertex.h> #include <g2o/core/base_binary_edge.h> #include <g2o/core/base_unary_edge.h> #include <g2o/core/block_solver.h> #include <g2o/core/optimization_algorithm_levenberg.h> #include <g2o/solvers/dense/linear_solver_dense.h> #include <g2o/types/slam3d/vertex_se3.h> #include <g2o/types/slam3d/edge_se3.h> #include <g2o/core/eigen_types.h> #include <g2o/types/slam3d/types_slam3d.h> #include <opencv2/opencv.hpp> using namespace std; using namespace Eigen; struct Edge { size_t s; // Start index size_t e; // End index Isometry3d pose; // Relative pose between start and end }; class INS { public: void optimizeTrajectory(std::vector<Isometry3d> &poses) { std::vector<Edge> edgeData; for (size_t i = 0; i < poses.size() - 1; ++i) { Edge edge_data; edge_data.s = i; edge_data.e = i + 1; edge_data.pose = poses[i].inverse() * poses[i + 1]; edgeData.push_back(edge_data); } // 添加最后一个点到第一个点的边 Edge edge_data; edge_data.s = poses.size() - 1; // 最后一个点的索引 edge_data.e = 0; // 第一个点的索引 Isometry3d error_pose = poses[edge_data.s]; Isometry3d true_pose = error_pose * calibration_error_.Get(); LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); edge_data.pose = true_pose.inverse() * poses[edge_data.e]; edgeData.push_back(edge_data); std::unique_ptr<g2o::LinearSolverDense<g2o::BlockSolverX::PoseMatrixType>> linearSolver = std::make_unique<g2o::LinearSolverDense<g2o::BlockSolverX::PoseMatrixType>>(); g2o::OptimizationAlgorithmLevenberg *solver = new g2o::OptimizationAlgorithmLevenberg( std::make_unique<g2o::BlockSolverX>(std::move(linearSolver))); g2o::SparseOptimizer optimizer; optimizer.setAlgorithm(solver); optimizer.setVerbose(false); for (int i = 0; i < poses.size(); i++) { g2o::VertexSE3 *v = new g2o::VertexSE3(); v->setId(i); v->setEstimate(poses[i]); if (i == 0) { v->setFixed(true); } optimizer.addVertex(v); } for (const auto &pData : edgeData) { g2o::EdgeSE3 *edge = new g2o::EdgeSE3(); edge->setVertex(0, optimizer.vertex(pData.s)); edge->setVertex(1, optimizer.vertex(pData.e)); if (&pData == &edgeData.back()) { LogWarn("*******&pData == &edgeData.back()************"); edge->setInformation(Matrix6d::Identity() * 100000); } else { edge->setInformation(Matrix6d::Identity() * 0.001); } edge->setMeasurement(pData.pose); optimizer.addEdge(edge); } optimizer.initializeOptimization(); optimizer.optimize(500); for (int i = 0; i < poses.size(); i++) { g2o::VertexSE3 *vertex = dynamic_cast<g2o::VertexSE3 *>(optimizer.vertex(i)); poses[i] = vertex->estimate(); } LogWarn("Trajectory optimization successful !!!!!!!!!!"); } private: struct CalibrationError { Isometry3d Get() const { Isometry3d calib; calib.setIdentity(); calib.translate(Vector3d(0.1, 0.1, 0.1)); // Example calibration error calib.rotate(AngleAxisd(Deg2Rad(0.1), Vector3d::UnitZ())); // Example rotation error return calib; } }; double Deg2Rad(double deg) const { return deg * M_PI / 180.0; } CalibrationError calibration_error_; template<typename T> void LogInfo(const T& message) { cout << "[INFO] " << message << endl; } template<typename T> void LogWarn(const T& message) { cout << "[WARN] " << message << endl; } string matrixToString(const Matrix4d& matrix) { stringstream ss; ss << matrix; return ss.str(); } }; void generateSimulatedTrajectory(std::vector<Isometry3d>& poses, int numPoints) { double sideLength = 4.0; // 正方形的边长 double angleStep = INS().Deg2Rad(90.0); // 每个转角的角度 for (int i = 0; i < numPoints; ++i) { Isometry3d pose = Isometry3d::Identity(); switch (i % 4) { case 0: pose.translation() = Vector3d(sideLength * (i / 4), 0, 0); break; case 1: pose.translation() = Vector3d(sideLength * (i / 4 + 1), 0, 0); pose.rotate(AngleAxisd(angleStep, Vector3d::UnitZ())); break; case 2: pose.translation() = Vector3d(sideLength * (i / 4 + 1), sideLength, 0); pose.rotate(AngleAxisd(angleStep * 2, Vector3d::UnitZ())); break; case 3: pose.translation() = Vector3d(sideLength * (i / 4), sideLength, 0); pose.rotate(AngleAxisd(angleStep * 3, Vector3d::UnitZ())); break; } // 加入误差 pose.translate(Vector3d(rand() / double(RAND_MAX) * 0.1, rand() / double(RAND_MAX) * 0.1, rand() / double(RAND_MAX) * 0.1)); pose.rotate(AngleAxisd(INS().Deg2Rad(rand() % 2), Vector3d::UnitZ())); poses.push_back(pose); } } void drawTrajectory(const std::vector<Isometry3d>& poses, const std::string& title) { cv::Mat img(800, 800, CV_8UC3, cv::Scalar(255, 255, 255)); for (size_t i = 0; i < poses.size(); ++i) { Vector3d pos = poses[i].translation(); if (i > 0) { Vector3d prevPos = poses[i-1].translation(); cv::line(img, cv::Point((prevPos.x() + 4.0) * 100, (-prevPos.y() + 4.0) * 100), cv::Point((pos.x() + 4.0) * 100, (-pos.y() + 4.0) * 100), cv::Scalar(0, 255, 0), 2); } cv::circle(img, cv::Point((pos.x() + 4.0) * 100, (-pos.y() + 4.0) * 100), 3, cv::Scalar(0, 0, 0), -1); } cv::imshow(title, img); cv::waitKey(1); } int main() { srand(time(NULL)); int numTrajectoryPoints = 16; // 轨迹点数量(正方形的四个角重复四次) std::vector<Isometry3d> trajectory(numTrajectoryPoints); // 生成模拟轨迹 generateSimulatedTrajectory(trajectory, numTrajectoryPoints); // 显示优化前的轨迹 drawTrajectory(trajectory, "Before Optimization"); // 创建INS对象并进行优化 INS ins_optimizer; ins_optimizer.optimizeTrajectory(trajectory); // 显示优化后的轨迹 drawTrajectory(trajectory, "After Optimization"); cv::waitKey(0); return 0; } 报错:/usr/include/c++/9/ostream:523:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<char, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/ostream:528:5: note: candidate: ‘template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char)’ 528 | operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c) | ^~~~~~~~ /usr/include/c++/9/ostream:528:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<char, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/ostream:548:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*)’ 548 | operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s) | ^~~~~~~~ /usr/include/c++/9/ostream:548:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/ostream:702, from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/bits/ostream.tcc:321:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*)’ 321 | operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s) | ^~~~~~~~ /usr/include/c++/9/bits/ostream.tcc:321:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/ostream:565:5: note: candidate: ‘template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*)’ 565 | operator<<(basic_ostream<char, _Traits>& __out, const char* __s) | ^~~~~~~~ /usr/include/c++/9/ostream:565:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<char, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/ostream:578:5: note: candidate: ‘template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*)’ 578 | operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s) | ^~~~~~~~ /usr/include/c++/9/ostream:578:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<char, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/ostream:583:5: note: candidate: ‘template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*)’ 583 | operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s) | ^~~~~~~~ /usr/include/c++/9/ostream:583:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<char, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/ostream:691:5: note: candidate: ‘template<class _Ostream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_ostream<_Ostream>, std::__is_insertable<typename std::__is_convertible_to_basic_ostream<_Tp>::__ostream_type, const _Tp&, void> >::value, typename std::__is_convertible_to_basic_ostream<_Tp>::__ostream_type>::type std::operator<<(_Ostream&&, const _Tp&)’ 691 | operator<<(_Ostream&& __os, const _Tp& __x) | ^~~~~~~~ /usr/include/c++/9/ostream:691:5: note: template argument deduction/substitution failed: /usr/include/c++/9/ostream: In substitution of ‘template<class _Ostream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_ostream<_Ostream>, std::__is_insertable<typename std::__is_convertible_to_basic_ostream<_Tp>::__ostream_type, const _Tp&, void> >::value, typename std::__is_convertible_to_basic_ostream<_Tp>::__ostream_type>::type std::operator<<(_Ostream&&, const _Tp&) [with _Ostream = const char (&)[32]; _Tp = std::__cxx11::basic_string<char>]’: /home/guo/g2o仿真/src/optimize.cc:46:103: required from here /usr/include/c++/9/ostream:691:5: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’ In file included from /usr/local/include/eigen3/Eigen/Core:50, from /home/guo/g2o仿真/src/optimize.cc:4: /usr/include/c++/9/complex:552:5: note: candidate: ‘template<class _Tp, class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::complex<_Tp>&)’ 552 | operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) | ^~~~~~~~ /usr/include/c++/9/complex:552:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/hyper_graph.h:31, from /opt/ros/noetic/include/g2o/core/optimizable_graph.h:35, from /opt/ros/noetic/include/g2o/core/base_vertex.h:30, from /home/guo/g2o仿真/src/optimize.cc:6: /usr/include/c++/9/bitset:1538:5: note: candidate: ‘template<class _CharT, class _Traits, long unsigned int _Nb> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::bitset<_Nb>&)’ 1538 | operator<<(std::basic_ostream<_CharT, _Traits>& __os, | ^~~~~~~~ /usr/include/c++/9/bitset:1538:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/include/c++/9/memory:81, from /opt/ros/noetic/include/g2o/core/robust_kernel.h:30, from /opt/ros/noetic/include/g2o/core/base_binary_edge.h:34, from /home/guo/g2o仿真/src/optimize.cc:7: /usr/include/c++/9/bits/shared_ptr.h:66:5: note: candidate: ‘template<class _Ch, class _Tr, class _Tp, __gnu_cxx::_Lock_policy _Lp> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::__shared_ptr<_Tp, _Lp>&)’ 66 | operator<<(std::basic_ostream<_Ch, _Tr>& __os, | ^~~~~~~~ /usr/include/c++/9/bits/shared_ptr.h:66:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:79:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Resetiosflags)’ 79 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Resetiosflags __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:79:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:109:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setiosflags)’ 109 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Setiosflags __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:109:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:143:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setbase)’ 143 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Setbase __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:143:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:178:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setfill<_CharT>)’ 178 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Setfill<_CharT> __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:178:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:208:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setprecision)’ 208 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Setprecision __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:208:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:238:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setw)’ 238 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Setw __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:238:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:311:5: note: candidate: ‘template<class _CharT, class _Traits, class _MoneyT> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Put_money<_MoneyT>)’ 311 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Put_money<_MoneyT> __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:311:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /opt/ros/noetic/include/g2o/core/sparse_block_matrix.h:34, from /opt/ros/noetic/include/g2o/core/solver.h:31, from /opt/ros/noetic/include/g2o/core/block_solver.h:31, from /home/guo/g2o仿真/src/optimize.cc:9: /usr/include/c++/9/iomanip:363:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Put_time<_CharT>)’ 363 | operator<<(basic_ostream<_CharT, _Traits>& __os, _Put_time<_CharT> __f) | ^~~~~~~~ /usr/include/c++/9/iomanip:363:5: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [32]’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ In file included from /usr/local/include/eigen3/Eigen/Core:269, from /home/guo/g2o仿真/src/optimize.cc:4: /usr/local/include/eigen3/Eigen/src/Core/IO.h:249:16: note: candidate: ‘template<class Derived> std::ostream& Eigen::operator<<(std::ostream&, const Eigen::DenseBase<Derived>&)’ 249 | std::ostream & operator << | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/Core/IO.h:249:16: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:46:103: note: ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} is not derived from ‘const Eigen::DenseBase<Derived>’ 46 | LogInfo("The map optimization error is:\n" << matrixToString(calibration_error_.Get().matrix())); | ^ /home/guo/g2o仿真/src/optimize.cc:77:38: error: ‘Matrix6d’ has not been declared 77 | edge->setInformation(Matrix6d::Identity() * 100000); | ^~~~~~~~ /home/guo/g2o仿真/src/optimize.cc:79:38: error: ‘Matrix6d’ has not been declared 79 | edge->setInformation(Matrix6d::Identity() * 0.001); | ^~~~~~~~ /home/guo/g2o仿真/src/optimize.cc: In member function ‘Eigen::Isometry3d INS::CalibrationError::Get() const’: /home/guo/g2o仿真/src/optimize.cc:101:48: error: cannot call member function ‘double INS::Deg2Rad(double) const’ without object 101 | calib.rotate(AngleAxisd(Deg2Rad(0.1), Vector3d::UnitZ())); // Example rotation error | ^ /home/guo/g2o仿真/src/optimize.cc: In function ‘void generateSimulatedTrajectory(std::vector<Eigen::Transform<double, 3, 1> >&, int)’: /home/guo/g2o仿真/src/optimize.cc:131:42: error: ‘double INS::Deg2Rad(double) const’ is private within this context 131 | double angleStep = INS().Deg2Rad(90.0); // 每个转角的角度 | ^ /home/guo/g2o仿真/src/optimize.cc:106:12: note: declared private here 106 | double Deg2Rad(double deg) const { | ^~~~~~~ /home/guo/g2o仿真/src/optimize.cc:146:56: error: ‘double INS::Deg2Rad(double) const’ is private within this context 146 | pose.rotate(AngleAxisd(INS().Deg2Rad(rand() % 2), Vector3d::UnitZ())); | ^ /home/guo/g2o仿真/src/optimize.cc:106:12: note: declared private here 106 | double Deg2Rad(double deg) const { | ^~~~~~~ make[2]: *** [CMakeFiles/g2o_demo.dir/build.make:76:CMakeFiles/g2o_demo.dir/optimize.cc.o] 错误 1 make[1]: *** [CMakeFiles/Makefile2:673:CMakeFiles/g2o_demo.dir/all] 错误 2 make: *** [Makefile:146:all] 错误 2 给出完整修改后代码
最新发布
08-03
In file included from /workspace/x2/dfx/modules/hiviewx_watcher/component/log_watcher/main.cpp:6: /workspace/x2/dfx/modules/hiviewx_watcher/component/log_watcher/include/glog_sink.h: In member function ‘void CustomFileSink::ReopenLogFile()’: /workspace/x2/dfx/modules/hiviewx_watcher/component/log_watcher/include/glog_sink.h:250:43: error: cannot convert ‘std::basic_ofstream<char>::__filebuf_type*’ {aka ‘std::basic_filebuf<char>*’} to ‘FILE*’ 250 | int fd = fileno(outfile_.rdbuf()); | ~~~~~~~~~~~~~~^~ | | | std::basic_ofstream<char>::__filebuf_type* {aka std::basic_filebuf<char>*} In file included from /usr/include/c++/11/cstdio:42, from /usr/include/c++/11/ext/string_conversions.h:43, from /usr/include/c++/11/bits/basic_string.h:6608, from /usr/include/c++/11/string:55, from /usr/include/c++/11/stdexcept:39, from /usr/include/boost/asio/execution/receiver_invocation_error.hpp:19, from /usr/include/boost/asio/execution/detail/as_invocable.hpp:22, from /usr/include/boost/asio/execution/execute.hpp:20, from /usr/include/boost/asio/execution/executor.hpp:20, from /usr/include/boost/asio/associated_executor.hpp:20, from /usr/include/boost/asio.hpp:21, from /workspace/x2/dfx/modules/hiviewx_watcher/component/log_watcher/main.cpp:2: /usr/include/stdio.h:809:26: note: initializing argument 1 of ‘int fileno(FILE*)’ 809 | extern int fileno (FILE *__stream) __THROW __wur; | ~~~~~~^~~~~~~~ make[2]: *** [modules/hiviewx_watcher/component/log_watcher/CMakeFiles/log_watcher.dir/build.make:76: modules/hiviewx_watcher/component/log_watcher/CMakeFiles/log_watcher.dir/main.cpp.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:585: modules/hiviewx_watcher/component/log_watcher/CMakeFiles/log_watcher.dir/all] Error 2 make: *** [Makefile:136: all] Error 2 ================================================== 这是我的报错信息. void ReopenLogFile() { std::lock_guard<std::mutex> lock(file_mutex_); // 先关闭现有文件 if (outfile_.is_open()) { outfile_.flush(); outfile_.close(); } // 确保目录存在 auto dir_path = std::filesystem::path(log_file_path_).parent_path(); if (!dir_path.empty()) { std::filesystem::create_directories(dir_path); } // 重新打开文件 outfile_.open(log_file_path_, std::ios::out | std::ios::app); if (!outfile_.is_open()) { std::cerr << "[ERROR] Failed to open log file: " << log_file_path_ << " - " << strerror(errno) << std::endl; } else { std::cout << "[DEBUG] Successfully reopened log file: " << log_file_path_ << std::endl; // 获取底层文件描述符 (仅用于调试) int fd = fileno(outfile_.rdbuf()); std::cout << "[DEBUG] New file descriptor: " << fd << std::endl; // 强制立即写入到磁盘 fsync(fd); } }这是我的代码.错误如何修改呢
07-30
<think>我们正在解决一个关于C++文件操作的问题:如何正确获取`std::ofstream`的底层文件描述符(实际上是文件描述符,即整数,但用户提到获取FILE*,注意区分)。根据引用,我们知道标准C++库没有提供直接获取文件描述符的方法,但我们可以使用特定编译器的扩展。在GNU libstdc++中,我们可以使用`__gnu_cxx::stdio_filebuf`来获取文件描述符。 用户提到的是`std::ofstream`(输出文件流),而引用[2]中展示了如何获取`std::ifstream`(输入文件流)的文件描述符。类似的方法也可以用于`std::ofstream`。 注意:用户问题中提到了“底层文件描述符(FILE*)”,但文件描述符(file descriptor)是一个整数(如int类型),而FILE*是C标准库中的文件流指针。它们是不同的概念。根据引用[2]和[3],我们这里讨论的是文件描述符(整数),而不是FILE*。但是,引用[2]中获取的是文件描述符(整数),而引用[3]提到了文件流指针(FILE*)和文件描述符(整数)的转换。所以我们需要明确用户到底需要什么。 根据用户问题:“获取std::ofstream的底层文件描述符(FILE*)”,这里存在混淆。通常,文件描述符(file descriptor)是整数,而FILE*是C标准库的流指针。在C++中,`std::ofstream`的底层实际上是使用文件描述符(整数)还是FILE*?实际上,C++标准库流(如ofstream)通常基于C的FILE*(文件流指针)实现,而文件流指针又可以与文件描述符(整数)相互转换。 但是,用户的问题中同时出现了“文件描述符”和“FILE*”,并且希望避免类型转换错误。因此,我们需要澄清: 1. 如果用户需要的是文件描述符(整数),那么我们可以使用类似引用[2]的方法,但针对`std::ofstream`。 2. 如果用户需要的是FILE*(C标准库的文件流指针),那么我们可以通过`rdbuf()`获取文件流缓冲区,然后使用一些方法得到FILE*。 引用[3]中提到了文件描述符与文件流指针的转换,但没有直接给出如何从`std::ofstream`获取FILE*的方法。 由于用户之前遇到了类型转换错误,我们假设用户尝试了某种转换但失败了。因此,我们将提供两种方案:获取文件描述符(整数)和获取FILE*。 然而,标准C++并没有提供这样的方法。所以我们将使用特定于编译器的扩展(GNU libstdc++)。注意,这种方法在非GCC编译器(如MSVC)上可能不可用。 根据引用[2],我们可以通过以下步骤获取文件描述符(整数): - 获取流的`rdbuf()`,它是一个`filebuf*`(实际上是`__gnu_cxx::stdio_filebuf<char>*`) - 然后调用其`fd()`方法。 同样的方法适用于`std::ofstream`。 另外,如果我们想获取FILE*,我们可以通过`__gnu_cxx::stdio_filebuf`的`file()`方法(在GNU扩展中)来获取底层的C文件流指针(FILE*)。 因此,我们有两种解决方案: 方案1:获取文件描述符(整数) 方案2:获取FILE* 我们将分别给出。 注意:由于使用了特定于编译器的扩展,代码的可移植性会受到影响。 下面我们分别展示如何获取`std::ofstream`的文件描述符(整数)和FILE*。 参考引用[2]中的方法,我们进行修改以适应`std::ofstream`。 步骤: 1. 包含必要的头文件:`<fstream>`, `<iostream>`, `<ext/stdio_filebuf.h>` 2. 创建`std::ofstream`对象并打开文件。 3. 获取流的缓冲区(rdbuf),并将其转换为`__gnu_cxx::stdio_filebuf<char>*`。 4. 调用`fd()`方法获取文件描述符(整数),或者调用`file()`方法获取FILE*。 示例代码: 获取文件描述符(整数): ```cpp #include <fstream> #include <iostream> #include <ext/stdio_filebuf.h> int main() { // 创建一个ofstream对象并打开文件 std::ofstream ofs("output.txt"); if (!ofs) { std::cerr << "Failed to open file for writing\n"; return 1; } // 获取文件流的缓冲区,并转换为stdio_filebuf类型 __gnu_cxx::stdio_filebuf<char>* filebuf = static_cast<__gnu_cxx::stdio_filebuf<char>*>(ofs.rdbuf()); if (!filebuf) { std::cerr << "Failed to get filebuf\n"; return 1; } // 获取文件描述符(整数) int fd = filebuf->fd(); std::cout << "File descriptor (int): " << fd << std::endl; // 注意:不要关闭文件描述符,因为文件流仍然在使用它 // 继续使用ofs进行写操作... ofs.close(); // 正常关闭文件流 return 0; } ``` 获取FILE*: ```cpp // 同上,包含头文件 int main() { std::ofstream ofs("output.txt"); if (!ofs) { std::cerr << "Failed to open file for writing\n"; return 1; } __gnu_cxx::stdio_filebuf<char>* filebuf = static_cast<__gnu_cxx::stdio_filebuf<char>*>(ofs.rdbuf()); if (!filebuf) { std::cerr << "Failed to get filebuf\n"; return 1; } // 获取底层的C文件流指针(FILE*) FILE* c_file = filebuf->file(); std::cout << "C file pointer: " << c_file << std::endl; // 注意:不要使用fclose关闭这个FILE*,因为文件流对象仍然管理着它 // 我们可以使用C函数操作这个FILE*,但要小心不要破坏流的状态 // 例如:我们可以用fprintf写入,但注意缓冲区问题(最好刷新) fprintf(c_file, "This is written via fprintf\n"); fflush(c_file); // 确保写入,否则可能因为缓冲而延迟 // 继续使用ofs进行写操作... 但注意:混合使用C++流和C的FILE*操作同一个文件需要谨慎,因为缓冲区是共享的,可能导致混乱。 ofs.close(); return 0; } ``` 重要提示:混合使用C++流和C的FILE*操作同一个文件可能会导致缓冲区不一致,因为两者都有自己的缓冲区。因此,除非必要,否则不建议同时使用两种方式操作同一个文件。 如果用户只需要文件描述符(整数)来进行一些系统调用(如fstat, fsync等),那么获取文件描述符就足够了,并且相对安全,因为系统调用不会影响流缓冲区。 但是,如果用户需要FILE*,那么要特别注意避免混合使用C和C++的I/O函数,或者确保在交替使用时进行刷新(flush)操作。 最后,注意这些扩展只在GNU libstdc++中可用(如GCC编译器中)。如果使用其他标准库(如LLVM的libc++),则需要使用不同的方法。 对于libc++(Clang的标准库),我们可以通过`rdbuf()`获取文件缓冲区,然后使用`__file_handle`或`native_handle`(如果可用)来获取文件描述符,但具体方法可能不同。这里我们只讨论GNU libstdc++。 总结:用户的问题可能是由于直接使用了不正确的类型转换导致的。通过使用GNU扩展中的`__gnu_cxx::stdio_filebuf`,我们可以安全地获取文件描述符或FILE*。 如果用户需要跨平台的方法,那么可能需要考虑使用系统特定的API(如POSIX的`fileno`函数)来从FILE*获取文件描述符,但前提是必须先获取FILE*。而获取FILE*同样依赖于编译器扩展。因此,跨平台获取文件描述符通常需要条件编译。 如果用户只需要文件描述符,并且希望跨平台,另一种方法是使用底层系统调用(如open)打开文件,然后使用`fdopen`将其与C的FILE*关联,或者使用`fstream`的`attach`方法(但标准C++没有提供)。因此,跨平台方法较为复杂,不在本回答范围内。 我们提供了针对GNU libstdc++的解决方案,希望这能解决用户的问题。 注意:在获取文件描述符或FILE*后,用户不应关闭它,因为文件流对象仍然拥有它,并在析构时关闭。 如果用户的问题是关于如何避免类型转换错误,那么使用正确的类型转换(如上所示)即可避免错误。 相关问题: 1. 如何在不使用编译器扩展的情况下获取C++文件流的文件描述符? 2. 在C++中混合使用C的I/O和C++的I/O操作有哪些风险? 3. 如何在不同编译器(如GCC和MSVC)中获取文件描述符? 4. 文件描述符和FILE*之间如何转换? 5. 如何通过文件描述符创建C++文件流? 我们将根据用户的问题生成相关问题。</think>### 如何正确获取 std::ofstream 的底层文件描述符 在 C++ 中,标准库不直接提供获取 `std::ofstream` 底层文件描述符的方法,但可通过编译器扩展实现。以下是两种可靠方法及注意事项: #### 方法 1:获取文件描述符(整数) 使用 GNU libstdc++ 扩展的 `stdio_filebuf`: ```cpp #include <fstream> #include <ext/stdio_filebuf.h> // GNU 扩展头文件 std::ofstream ofs("output.txt"); if (!ofs) { /* 错误处理 */ } // 获取文件缓冲区并转换为扩展类型 auto* filebuf = static_cast<__gnu_cxx::stdio_filebuf<char>*>(ofs.rdbuf()); if (!filebuf) { /* 错误处理 */ } int fd = filebuf->fd(); // 底层文件描述符 std::cout << "文件描述符: " << fd << std::endl; ``` **关键点**: 1. 需包含 `<ext/stdio_filebuf.h>` 2. `fd()` 返回 POSIX 文件描述符(`int` 类型) 3. 仅适用于 GNU 编译器(GCC)[^2] #### 方法 2:获取 C 文件指针(`FILE*`) 通过相同扩展获取 `FILE*`: ```cpp FILE* c_file = filebuf->file(); // 获取底层 C 文件指针 fprintf(c_file, "通过C接口写入\n"); fflush(c_file); // 确保同步缓冲区 ``` **注意事项**: 1. **禁止关闭**获取的 `fd` 或 `FILE*`,流对象会自行管理资源 2. **避免混合 I/O**:同时使用 C++ 流和 C 文件操作可能导致缓冲区不一致 3. 写入后建议调用 `fflush()` 或 `ofs.flush()` 确保数据同步[^3] --- ### 常见错误解决方案 **问题:类型转换错误** ```cpp // 错误示例:直接转换 rdbuf() int fd = fileno(static_cast<FILE*>(ofs.rdbuf())); // 编译错误 ``` **原因**: - `rdbuf()` 返回 `std::filebuf*`,与 `FILE*` 无直接继承关系 - `fileno()` 是 POSIX 函数,需 `FILE*` 参数 **正确做法**: 使用前述的 `__gnu_cxx::stdio_filebuf` 扩展方法获取文件描述符,或通过 `file()` 方法获取 `FILE*` 后再操作[^2][^3]。 --- ### 跨平台替代方案 如需跨平台,可考虑: ```cpp // 先用 C 函数打开文件 FILE* cfile = fopen("output.txt", "w"); int fd = fileno(cfile); // 获取描述符 // 将 FILE* 关联到 C++ 流 __gnu_cxx::stdio_filebuf<char> buf(cfile, std::ios::out); std::ostream os(&buf); os << "通过关联流写入\n"; ``` 此方法依赖 `__gnu_cxx::stdio_filebuf` 构造函数,但仍限于 GCC[^3]。 --- ### 关键总结 1. **区分概念**: - 文件描述符:`int` 类型(POSIX 标识符) - 文件指针:`FILE*` 类型(C 标准库对象) 2. **编译器依赖**:GNU libstdc++ 需使用 `__gnu_cxx::stdio_filebuf` 3. **资源管理**:切勿手动关闭获取的描述符或指针 4. **操作风险**:混合 C/C++ I/O 需谨慎处理缓冲区[^3][^4] > 示例中预分配文件空间的技巧:`file.seekp(1023); file.put('\0');` 可创建固定大小文件[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值