当我尝试链接两个扩展名为.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
答案 0 :(得分:0)
对于相互引用的对象,有时您需要多次将它们包含在路径中,以便链接器可以进行所有正确的连接。
gcc -o file file1.o file2.o file1.o file2.o
答案 1 :(得分:0)
错误" undefined reference
"您看到的错误是由链接器生成的,当尝试满足file1.o
的外部引用时,无法找到Function1
或Function2
。假设这些符号在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