g ++ - 禁用源自外部lib的链接时警告

时间:2013-07-03 11:00:37

标签: c++ oracle warnings ld glibc

我在链接时收到以下警告:

/opt/oracle/11.2.0.3/lib/libclntst11.a(cc_memory.o): In function `krb5_mcc_generate_new':
cc_memory.c:(text.unlikely+0xd3d): warning: the use of `mktemp' is dangerous, better use `mkstemp'

我链接到`g ++ [...] -L / opt / oracle / 11.2.0.3 / lib -lclntst11 [...]

有没有办法隐藏此警告?
它污染了构建日志(获得了许多使用Oracle客户端的可执行文件)。

我知道-isystem可以减少来自外部库的警告数量,但仅限于标题。

感谢。

2 个答案:

答案 0 :(得分:1)

我将以下内容放在我的程序中(不在它链接到的库中):

// to silence warnings when linking to libwhatever.a
extern "C" char* mktemp(char*) { __builtin_abort(); }

链接器将优先使用该定义而不是libc.so中的定义... 只有库实际上不会实际调用mktemp时才会出现这种情况!在我的情况下,我知道我正在链接到引用它的库,但我从不使用调用它的功能。如果程序使用的代码调用mktemp,则会中止。

另一个替代方案是提供您自己的mktemp定义,可能使用mkstemp实现并删除它创建的文件,尽管它仍然具有mktemp具有的相同危险竞争条件(mktemp基本上是一个破坏的API。)

您应该向Oracle抱怨提供依赖于破坏的API的库。

答案 1 :(得分:-1)

  

有没有办法隐藏此警告?

当然:从源代码重建libc以删除它[警告:这可能需要root权限,如果操作不正确,可能会导致系统无法启动]。

但你为什么这么想?如果您理解了警告并选择忽略它,那么......忽略它?

如果您不理解警告,则应该。