链接中未定义的引用错误

时间:2014-05-11 07:22:27

标签: c gcc linker cygwin

当我尝试链接两个扩展名为.o的程序时,gcc编译器会“抛出”undefined reference以及我不理解的其他内容。

我使用该命令在Cygwin终端链接这些程序:

gcc -o file file1.o file2.o

我没有其他要包含的库math.h(因此需要-lm)。

我在头文件中只有两个函数,并将其包含在我的主程序中。

我明白了:

file1.o:file1.c(.text+0x2a): undefined reference to `Function1'
file1.o:file1.c:(.text+0x104): undefined reference to `Function2'
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../../i686-pc-cygwin/bin/ld: file1.o: bad reloc address 0x20 in section `.eh_frame'
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../../i686-pc-cygwin/bin/ld: final link failed: Invalid operation
collect2: error: ld returned 1 exit status

2 个答案:

答案 0 :(得分:0)

对于相互引用的对象,有时您需要多次将它们包含在路径中,以便链接器可以进行所有正确的连接。

gcc -o file file1.o file2.o file1.o file2.o

答案 1 :(得分:0)

错误" undefined reference"您看到的错误是由链接器生成的,当尝试满足file1.o的外部引用时,无法找到Function1Function2。假设这些符号在file2.o中,一个简单的解决方案就是确保首先链接file2.o,所以:

gcc -o file file2.o file1.o

请注意,呈现目标文件以进行链接的顺序非常重要。当然,如果file2.o需要file1.o中存在的符号,那么我们又回到了循环依赖的相同问题。

如果你不能消除循环依赖,那么" hack"经常使用的是在链接命令中多次包含目标文件,例如:

gcc -o file file1.o file2.o file1.o

然而,这种方法并没有真正扩展到大型解决方案。你理想的想要的是链接搜索"包"所需符号的目标文件。通过使用包含目标文件的存档文件可以实现此行为。 GNU链接器至少会搜索存档中的文件以尝试解析符号。因此:

ar cr libfiles.a file1.o file2.o

gcc -o file libfiles.a file1.o file2.o