【问题标题】:Can't output through std::cout from static library无法从静态库通过 std::cout 输出
【发布时间】:2011-02-17 18:17:00
【问题描述】:

我正在链接一个静态库,该库有一个 std::cout 包装器,如果我从应用程序代码中使用它就可以工作,但库的内部输出(以完全相同的方式使用)都没有显示任何输出。

也许这并不重要,但我正在使用 Qt Creator 和 qmake 项目文件来构建。我已将console 添加到应用程序的CONFIG 中(甚至尝试将其用于静态库,但没有效果)。

可能出了什么问题,我该如何解决?谢谢!

更新:嗯,包装器是this one的改编版本:

【问题讨论】:

  • 代码胜于雄辩。
  • 根据链接帖子的代码,只有通过该类的数据才会被过滤;包装器无法直接访问std::cout 的输出。

标签: c++ static-libraries cout


【解决方案1】:

std::cout 包装器将无法隐式“进入”另一个库。您是否考虑过完全重定向cout?类似src:

int main() { 
    std::streambuf* cout_sbuf = std::cout.rdbuf(); // save original sbuf 
    std::ofstream   fout("cout.txt"); 
    std::cout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout' 
    // ... 
    std::cout.rdbuf(cout_sbuf); // restore the original stream buffer 
}

这样您就可以控制输入到 std::cout 的数据,而不管库在做什么输出(当然,除非它们自己重定向 std::cout。)

【讨论】:

  • 您应该使用 RIAA 来确保返回原始缓冲区。我见过在构造期间动态分配 cout 缓冲区并在销毁时删除的实现。如果你弄乱了指向 UB 的指针,所以你应该在 cout 对象被销毁之前恢复原始缓冲区以防万一(就像你做的那样,但以异常安全的方式)。
  • 嗯,这是我自己的库,它对 cout 流没有什么特别的作用。
  • 我认为您的意思是 RAII - 资源分配是初始化,而不是唱片业 ;)
  • 我发现了我的问题,这是一个邪恶的错字,对于这个输出的工作来说至关重要......不过我接受了你的回答。不过还是谢谢。
猜你喜欢
  • 2015-02-03
  • 2013-09-11
  • 2011-07-08
  • 2017-06-30
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2011-06-05
  • 2017-09-15
相关资源
最近更新 更多