11

いくつかの LLVM ツール (などllvm-nm) を静的ライブラリとして使用しています。つまり、ソースllvm-nm.cppをコピーし、名前を変更main(..)llvm_nm(..)て静的ライブラリとしてコンパイルしました。標準出力を自分のファイルに転送したいと思います。

私は次のアプローチを使用しようとしました:

  int    out_fd, err_fd;
  fpos_t out_pos, err_pos;

  // redirect out
  fflush(stdout);
  fgetpos(stdout, &out_pos);
  out_fd = dup(fileno(stdout));
  freopen(outFilename, "w", stdout);

  // execute
  int ret = llvm_nm(argc_, argv_);

  // restore output
  fflush(stdout);
  dup2(out_fd, fileno(stdout));
  close(out_fd);
  clearerr(stdout);
  fsetpos(stdout, &out_pos); 

問題は、転送されてprintf()いないことです (出力ではなく nm ソース コードを追加すると機能しnmます)。llvm::outs()ソースを調べたところ、ストリームを使用して出力が行われていることがわかります。

outs() << "Archive map" << "\n";

そして、それは次の方法で実装されます:

/// outs() - This returns a reference to a raw_ostream for standard output.
00702 /// Use it like: outs() << "foo" << "bar";
00703 raw_ostream &llvm::outs() {
00704   // Set buffer settings to model stdout behavior.
00705   // Delete the file descriptor when the program exits, forcing error
00706   // detection. If you don't want this behavior, don't use outs().
00707   static raw_fd_ostream S(STDOUT_FILENO, true);
00708   return S;
00709 }

その出力を自分のファイルにリダイレクトするにはどうすればよいですか?

4

2 に答える 2