【问题标题】:Undefined reference error in linking链接中未定义的引用错误
【发布时间】:2014-05-11 07:22:27
【问题描述】:

当我试图链接两个扩展名为 .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

【问题讨论】:

  • 如果不查看代码,将很难诊断您的问题。可以发一下相关代码吗?
  • 有点长,但我会尝试...:
  • 它们是否相互引用?有时您需要多次将 .o 文件添加到链接路径中。
  • 如果你尝试gcc -o file file1.c file2.c会发生什么?
  • 你的函数Function1Function2是否定义为extern函数?

标签: c gcc linker cygwin


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您看到的错误“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
    

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2014-04-21
      • 2013-03-15
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2016-06-10
      相关资源
      最近更新 更多