有没有办法忽略未使用的未定义引用?

Is there a way to ignore unused undefined references?

提问人:Hi-Angel 提问时间:6/11/2014 最后编辑:Hi-Angel 更新时间:11/2/2017 访问量:4706

问:

假设我有两个源文件 — UndefErr.cpp

#include <cstdio>

void UndefFunc();
void Func2(){UndefFunc();}

void Func1(){printf("Hi\n");}

主.cpp

void Func1();

int main(){
    Func1();
    return 0;
}

正如您在 UndefErr.cpp 中看到的,将触发错误,因为它使用 undefined .但是,main 函数并不关心 !根据相关问题,我可以将选项 --unresolved-symbols=ignore-in-object-files 传递给链接器,但我想要一个不同的东西。我需要一个链接器来知道未定义的函数是否在某处使用,然后才失败。Func2()UndefFunc()Func2()

之所以问这么奇怪的问题,是因为我正在尝试使用lwIP,很难理解它的所有依赖关系(我只需要TCP/IP),而且我在互联网上找不到教程。所以我想我可以单独编译大部分(或全部).c 文件,并编写一些简单的测试来看看它的作用。但是这种方法偶然发现了“未定义的引用”,其中大多数可能与用例无关。

C++ GCC 链接器 LD 未定义引用

评论

0赞 mark 6/11/2014
似乎链接器可以“弄清楚”是否需要解决引用......不过,一种解决方案是,如果没有很多功能使其繁琐,您可以将它们存根在 Main.cpp 中......例如void UndefFunc() {}
0赞 Hi-Angel 6/11/2014
@mark不,在项目中功能非常多。我不知道的主要问题,哪些功能没有使用,这就是为什么我想以某种方式自动化它。
0赞 BЈовић 6/11/2014
我不明白这个问题。如果链接器遇到未定义的函数,它将会抱怨。
0赞 Hi-Angel 6/11/2014
@B是的,但是如果未定义的函数未使用,则忽略它可能更有意义。如何忽略这样的引用只是一个问题。

答:

3赞 polkovnikov.ph 6/11/2014 #1

问题在于使用了未定义的函数。已生成的目标代码,有一个对不存在的引用,它转到链接器。编译器无法理解此函数将始终未定义,因为有多个翻译单元。Func2UndefFunc

避免编译错误的唯一方法是告诉链接器您不需要未使用的函数的目标代码,这样它就不会尝试为这种情况生成程序集。

评论

1赞 Hi-Angel 6/11/2014
我四处寻找,我发现我可能需要两件事:用作标志,以便每个函数都位于它自己的部分中(以允许链接器查看部分之间的引用),然后链接器需要知道确切的函数(在我的情况下是主要函数),需要从中跟踪引用。我还刚刚发现 LD 有一种脚本语言,所以可能我就在这里——似乎没有一个标准的方式来做我想做的事。-fdata-sections -ffunction-sections
0赞 Hi-Angel 6/11/2014
我认为值得一提的是,在上面的场景中,我应该从函数进行跟踪,因为它是第一个要执行的函数。否则我可能会得到一个损坏的可执行文件。_start
5赞 lvella 6/11/2014 #2

在 Gcc 4.8.2 中,我设法将代码链接到以下代码而不会出错:

$ g++ -c main.cpp -O3 -flto
$ g++ -c UndefErr.cpp -O3 -flto
$ g++ main.o UndefErr.o -flto -O3 -o out

我知道会使链接器表现得好像被传递了一样,整个事情是一个单一的编译单元。并且,根据手册,对应于 on 函数的正确用法,因此允许从输出中删除未使用的函数(即,您向编译器保证您的所有函数不会被其他代码使用,可能是动态加载的,并且您为用户保证的唯一入口点是)。-flto-fwhole-program-fwhole-programstaticmain()

我不得不补充一点,我不确定为什么,但是编译器对检查函数和在没有它的情况下消除死代码不是很感兴趣。-O3

评论

0赞 Hi-Angel 6/11/2014
太好了,我从来不知道这个选项!是的,如果没有在编译时传递,链接器出于某种原因拒绝中止未使用的函数。-O3
1赞 Richard Lang 7/22/2016
使用 MinGW GCC 5.3.0 的 MSYS2 版本,我能够消除未使用的函数,从而避免使用编译器选项引用的符号的“未定义引用”错误-flto -Og