假设我有两个源文件 - UndefErr.cpp :
#include <cstdio>
void UndefFunc();
void Func2(){UndefFunc();}
void Func1(){printf("Hi\n");}
main.cpp :
void Func1();
int main(){
Func1();
return 0;
}
正如您在 UndefErr.cpp 中看到的那样Func2()
会触发错误,因为它使用了未定义的UndefFunc()
。但是主要功能并不关心Func2()
!根据{{3}},我可以将选项 - unresolved-symbols = ignore-in-object-files 传递给链接器,但我想要一个不同的东西。我需要一个链接器来知道未定义的函数是否在某处使用,然后才会失败。
提出这样一个奇怪问题的原因是我试图使用a relevant question,并且很难理解它的所有依赖(我只需要TCP / IP)< / em>,我无法在互联网上找到教程。所以我认为我可以单独编译大多数(或所有) .c文件,并编写一些简单的测试来查看它的作用。但是这种方法偶然发现&#34;未定义的引用&#34;,其中大多数可能与用例无关。
答案 0 :(得分:4)
使用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
我知道-flto
将使链接器的行为就像传递-fwhole-program
一样,整个事情就是一个编译单元。根据手册,-fwhole-program
对应于static
对函数的正确使用,因此允许从输出中消除未使用的函数(即,您确保编译器不会使用所有函数)通过其他一些代码,可能是动态加载的,并且您为用户保证的唯一入口点是main()
。
我不得不添加-O3
,我不确定为什么,但编译器对检查函数并消除死代码不感兴趣。
答案 1 :(得分:3)
问题是未使用的未定义函数 。已生成Func2
的目标代码,其中包含对未存在的UndefFunc
的引用,并且它将转到链接器。编译器无法理解由于存在多个转换单元,因此该函数将始终未定义。
避免编译错误的唯一方法是告诉链接器你不需要未使用函数的目标代码,这样它就不会尝试为这种情况生成程序集