我在链接时收到以下警告:
/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
可以减少来自外部库的警告数量,但仅限于标题。
感谢。
答案 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权限,如果操作不正确,可能会导致系统无法启动]。
但你为什么这么想?如果您理解了警告并选择忽略它,那么......忽略它?
如果您不理解警告,则应该。