从库中禁用/删除printfs

时间:2013-09-11 11:56:19

标签: gcc embedded printf

我们有一个供应商提供的库,其中打开了printfs。这是一个很大的烦恼,我们希望将其关闭或禁用它。

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

我们正在使用gcc工具链作为嵌入式(sh4)平台。

谢谢!

2 个答案:

答案 0 :(得分: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
    

答案 1 :(得分: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""CON"设备,而不是"/dev/null""/dev/tty"