对写入新文件的函数的“未定义引用”上的链接器错误,但在将相同函数添加到现有文件时工作正常

Linker error on "Undefined reference" to functions written a new file, but works fine when same functions are added to existing file

提问人:Photonslave 提问时间:4/7/2023 最后编辑:Photonslave 更新时间:4/7/2023 访问量:142

问:

我有一个带有外部子模块 SUB 的项目 PROJ。该子模块调用了一些未在我们的项目中定义的外部函数 f1()、f2()、f3(),因此链接器失败,并带有对这些函数的“未定义引用”。我们的项目不需要这些功能。但是我不能注释掉这些函数调用,因为我不允许对调用它们的外部子模块进行更改。因此,我为函数 f1()、f2()、f3() 添加了一个存根(虚拟)实现。

我最初将存根添加到现有的 C 源文件 common_lib.c 中,链接器对此很满意。但是我需要在新文件 stub_lib.c 中定义所有存根。但是,当我这样做时,链接器再次出现“未定义的引用”错误。common_lib 和 stub_lib 都被编译为同一个存档文件 liball.a 的一部分,我使用“nm”确认函数定义在 liball.a 中

为什么链接者还在抱怨?

这是我尝试过的事情:

  1. 将存根函数添加到现有的 C 源文件(有效),而不是写入新文件
  2. 确保新的 C 源文件 stub_lib.c 包含在编译中并添加到存档文件中
  3. 已使用 nm 确保函数定义位于存档文件中
  4. 将函数定义保留在 stub_lib.c 和 common_lib.c 中,看看会发生什么。存档文件输出显示函数在两个 .o 文件中都定义,但链接器不会抱怨多个定义,并且由于 common_lib.c 中定义的函数,它链接正常

stub_lib.c.o:

0000000000000043 T f1

0000000000000064 T f2

0000000000000088 T f3

common_lib.c.o:

0000000000000286 T f1

000000000000002a7 T f2

00000000000002cb T f3

链接器错误 undefined-reference 存根 undefined-function

评论


答: 暂无答案