1

我们有一个供应商提供的库,它打开了 printfs。这是一个主要的烦恼,我们想以某种方式将其关闭或禁用。

有没有办法在不访问库源代码的情况下完全禁用该库中所有内容的 printfs?我们希望在应用程序的其他部分有 printfs。

我们将 gcc 工具链用于嵌入式(sh4)平台。

谢谢!

4

2 回答 2

3

您可以破解库以调用虚拟包装函数而不是真正的printf. 以下是您的操作方式(假设库作为静态库分发):

  1. 创建一个名为的文件wrap_printf.c,其内容如下:

    int __wrap_printf(const char *fmt, ...) {
        return 0;
    }
    
  2. 编译包装器:

    gcc wrap_printf.c -c -o wrap_printf.o
    
  3. 解压库:

    mkdir libobj; cd libobj; ar x libvendor.a
    
  4. 重新链接每个供应商对象文件以使用包装器:

    for obj in libobj/*.o; do ld --wrap=printf $obj -r -o $obj
    
  5. 重建库,包括包装器:

    ar rcs libvendor_noprintf.a wrap_printf.o libobj/*.o
    
  6. 像往常一样将您的程序与新库链接

    gcc program.o -lvendor_noprintf -o prog
    
于 2013-09-11T14:11:47.453 回答
0

在特定情况下,当您只有一个使用库的地方时,您可以使用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"

于 2013-09-13T07:55:48.267 回答