printfsがオンになっているベンダー提供のライブラリがあります。これは大きな煩わしさであり、何らかの方法でオフにするか、無効にしたいと考えています。
ライブラリのソース コードにアクセスせずに、このライブラリ内のすべての printfs を完全に無効にする方法はありますか? アプリケーションの別の部分に printfs を追加したいと考えています。
組み込み (sh4) プラットフォームに gcc ツールチェーンを使用しています。
ありがとう!
ライブラリをハックして、本物の代わりにダミーのラッパー関数を呼び出すことができますprintf
。これを行う方法は次のとおりです(ライブラリが静的ライブラリとして配布されていると仮定します):
wrap_printf.c
次の内容のというファイルを作成します。
int __wrap_printf(const char *fmt, ...) {
return 0;
}
ラッパーをコンパイルします。
gcc wrap_printf.c -c -o wrap_printf.o
ライブラリを解凍します。
mkdir libobj; cd libobj; ar x libvendor.a
各ベンダー オブジェクト ファイルを再リンクして、ラッパーを使用します。
for obj in libobj/*.o; do ld --wrap=printf $obj -r -o $obj
ラッパーを含むライブラリを再構築します。
ar rcs libvendor_noprintf.a wrap_printf.o libobj/*.o
通常どおり、プログラムを新しいライブラリにリンクします
gcc program.o -lvendor_noprintf -o prog
ライブラリを使用する場所が 1 つしかない場合は、freopen
stdout をリダイレクトするために使用できます。Linux でこのサンプルを試してください。
#include <stdio.h>
int
main(void)
{
printf("This goes to screen\n");
freopen("/dev/null", "w", stdout);
printf("This goes to nowhere");
freopen("/dev/tty", "w", stdout);
printf("This goes to screen again\n");
return 0;
}
この方法の欠点は、プラットフォームに依存することです。Windows では、 andの代わりに"NUL"
and "CON"
devices を使用する必要があります"/dev/null"
"/dev/tty"