This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:链接错误:将函数定义移动到不同的源文件后仍存在未解析的符号

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/575332/compiler-linking-error-unresolved-symbols-remain-after-moving-function-definitions-to-different-source-file

工具/软件:TI C/C++编译器

在移动这些函数定义之前,一切都可以正常编译。 现在我收到了一个未解决的符号错误,无法找出原因。

我将4个函数定义从一个源文件(例如file1.c)移动到另一个源文件file.c. 我只是剪切和粘贴这些定义,我根本没有做任何更改。

我还更新了相应的头文件file1.h和file2.h。 我从file1.h剪切函数声明并将其粘贴到file.2.h中

然后,我将先前为移动的函数引用file1.h的所有其他源文件更新为引用file.2.h

由于某种原因,链接程序无法找到fil2.c中的4个函数中的2个。 其他2个工作正常。 2个工作功能和2个非工作功能没有明显的区别。 所有4个函数都非常简单,代码行数不到5行。 它们的定义也有类似的格式。  

现在,如果我从file2.c复制两个不工作的函数定义并将 其粘贴回file1.c,一切都正常,即使不更新file1.h或file2.h以反映此更改也是如此。 编译器不会抱怨多个定义,即使file1.c和file2.c都包含2个相同的函数定义。

编译器似乎由于某种原因在file2.c中看不到这2个函数。

我正在使用CCS 版本:6.1 .0.0.0104万。 如果需要更多详细信息,请告诉我。

也许值得注意的是,我当天早些时候也通过转到"文件">"重命名"重命名了项目。 我在这之后就可以编译了,没有任何问题。

对可能发生的事情有什么想法? 某些参考文件是否可以缓存一些需要清除的旧数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否,没有编译缓存。  有些奇怪的事情正在发生。

    • 修改每个文件时,CCS是否正确地重新编译它?
    • 这些函数中有任何一个是内联函数还是静态函数?
    • 让编译器保留汇编文件(选项--keep _asm)。  遗失的函数是否出现在装配体文件中?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    所有4个函数都是内联的。 在您提到这一点后,我尝试删除内联,现在一切似乎都正常。

    为什么会出现这种问题? 为什么两个内联函数都很好,而另外两个则不好?

    编辑:我认为两个buggy函数实际上是内联的,因为它们经常被使用,而另外两个函数工作正常,也使用内联关键字,但实际上没有内联,因为它们不经常被使用? 但除此之外,为什么所有4个函数都在文件1.c中,它们一开始就能正常链接?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2个“缺失”函数的所有调用方很可能都在file.c.中 当函数实际出现在file1.c中时,它们将被内联而不会出现问题。 但是,当您将它们移动到file2.c时,它们不能在file1.c中内联,因此您可以从file1.c获得函数调用 出于任何原因(可能是功能是静态的?) fil2.c中的定义未在目标文件中结束(可能在fil2.c中未使用这些定义?),因此调用在链接时最终未解析。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这两个缺少的函数根本不是由file1.c调用的,但实际上它们是由文件2.c调用的

    我没有真正提到还有其他源文件,它们也调用了缺失的函数(这些函数也不是静态的)。

    我想当"缺失"的函数在file1.c中时,其他文件可以从外部链接到这些函数,但现在缺失的函数在file2.c中,它们只在内部链接?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也许,但如果不查看所有源代码,我无法肯定地告诉您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这最终成为了一个问题。 在fil2.c中保留“缺失”函数定义的内联关键字时,我删除了fil2.c中“缺失”函数的函数调用,编译器停止了抱怨。 感谢您的帮助!