提问人:Hi-Angel 提问时间:6/11/2014 最后编辑:Hi-Angel 更新时间:11/2/2017 访问量:4706
有没有办法忽略未使用的未定义引用?
Is there a way to ignore unused undefined references?
问:
假设我有两个源文件 — 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 文件,并编写一些简单的测试来看看它的作用。但是这种方法偶然发现了“未定义的引用”,其中大多数可能与用例无关。
答:
问题在于使用了未定义的函数。已生成的目标代码,有一个对不存在的引用,它转到链接器。编译器无法理解此函数将始终未定义,因为有多个翻译单元。Func2
UndefFunc
避免编译错误的唯一方法是告诉链接器您不需要未使用的函数的目标代码,这样它就不会尝试为这种情况生成程序集。
评论
-fdata-sections -ffunction-sections
_start
在 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-program
static
main()
我不得不补充一点,我不确定为什么,但是编译器对检查函数和在没有它的情况下消除死代码不是很感兴趣。-O3
评论
-O3
-flto -Og
评论
void UndefFunc() {}