已配置静默模式仍有Ceres Solver日志输出,如何彻底关闭?
关闭Ceres Solver多余日志的方法
你遇到的日志来自两部分:一是CHOLMOD(SuiteSparse依赖库)的输出,二是Ceres内部的调试级日志。仅设置logging_type = SILENT不足以关闭这些,需要额外配置:
1. 关闭CHOLMOD的日志输出
CHOLMOD的日志不受Ceres的logging_type控制,可通过两种方式关闭:
环境变量方式
在程序启动前设置环境变量,禁止CHOLMOD输出:export SUITESPARSE_NO_CONFIG=1或在代码开头添加:
setenv("SUITESPARSE_NO_CONFIG", "1", 1);代码配置方式
针对SPARSE_NORMAL_CHOLESKY求解器,直接配置其内部CHOLMOD参数:ceres::Solver::Options options; options.max_num_iterations = 200; options.linear_solver_type = ceres::SPARSE_NORMAL_CHOLESKY; options.logging_type = ceres::SILENT; options.minimizer_progress_to_stdout = false; options.function_tolerance = 1e-8; // 关闭CHOLMOD打印 ceres::SparseNormalCholeskyOptions cholesky_options; cholesky_options.cholmod_options.print = 0; options.sparse_normal_cholesky_options = cholesky_options; ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary);
2. 关闭Ceres内部调试日志
你看到的block_sparse_matrix.cc类日志属于Ceres调试输出,通常是编译时开启了Debug模式导致:
- 如果用Release模式编译Ceres,这类日志会自动关闭。
- 若必须用Debug编译,可在代码中提前定义宏禁用调试日志:
或者编译Ceres时添加参数:#define CERES_NO_DEBUG #include <ceres/ceres.h>-DCERES_NO_DEBUG=ON。
3. 终极方案:临时屏蔽输出流(不推荐,仅作兜底)
如果以上方法无效,可在求解前临时关闭标准输出/错误流,求解后恢复:
#include <iostream> // 保存原有流缓冲 std::streambuf* old_cout = std::cout.rdbuf(); std::streambuf* old_cerr = std::cerr.rdbuf(); // 关闭输出 std::cout.rdbuf(nullptr); std::cerr.rdbuf(nullptr); ceres::Solve(options, &problem, &summary); // 恢复输出 std::cout.rdbuf(old_cout); std::cerr.rdbuf(old_cerr);
内容的提问来源于stack exchange,提问作者Ace_Run
相关产品推荐
相关产品推荐

