如何解决GCC 可以警告库中未定义的函数吗?
考虑以下测试项目:
test.h
:
#ifndef TEST_H
#define TEST_H
void test1(int);
void test2(int);
#endif /* TEST_H */
text.c
:
#include "test.h"
void test1(int x) { (void) x; }
糟糕,我忘记定义 test2()
!当我这样做时,我想要一些反馈,最好拒绝编译,尽管警告至少会很好。但是 GCC 10.2(在 Ubuntu 20.10 上)编译得很好,没有警告:
gcc -Wall -Wextra -Wpedantic -std=c11 -o libtest.o -c test.c
我想我明白为什么:如果 test2()
实际上来自另一个库,也许是一个系统库怎么办?让它成为最终将所有内容链接到可执行文件的程序的问题!但我想在那之前知道它。在这种情况下,它没有在任何包含的头文件中声明。它没有被称为任何地方。可以检测到吗?
我试过了:
-
--no-undefined
导致gcc: error: unrecognized command-line option ‘--no-undefined’; did you mean ‘-Wno-undef’?
-
-Wno-undef
- 接受但没有警告 -
-z,defs
- 接受但没有警告 -
-Wimplicit-function-declaration
- 接受但没有警告 -
-Werror=missing-declarations
- 我知道这是相反的情况,但我越来越绝望了。
解决方法
这是不可能的,因为在组装静态库的阶段没有执行链接。
我建议为您的图书馆配备一个“测试容器”。设置构建系统以在构建库时构建测试可执行文件。它甚至可能只是与库源位于同一目录中的单个 .c
文件,但显然不在属于库的对象列表中。
测试可执行文件调用您希望作为库入口点的所有函数。
为了在发布之前测试库的功能,这可能是您无论如何都应该做的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。