我们有一个供应商提供的库,它打开了 printfs。这是一个主要的烦恼,我们想以某种方式将其关闭或禁用。
有没有办法在不访问库源代码的情况下完全禁用该库中所有内容的 printfs?我们希望在应用程序的其他部分有 printfs。
我们将 gcc 工具链用于嵌入式(sh4)平台。
谢谢!
您可以破解库以调用虚拟包装函数而不是真正的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
在特定情况下,当您只有一个使用库的地方时,您可以使用freopen
重定向标准输出。在 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 上,您必须使用"NUL"
and"CON"
设备而不是"/dev/null"
and"/dev/tty"