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.

[参考译文] 编译器/TMS320F28388D:如何从运行时库中删除与辅助函数相关的错误和警告?

Guru**** 2590240 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/968907/compiler-tms320f28388d-how-to-remove-errors-and-warning-related-to-the-helper-function-from-run-time-libraries

器件型号:TMS320F28388D

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

尊敬的 TI:

我们一直在使用项目测试自定义运行时间库。 自从我们开始调试以来、我可以看到 sqrt 函数发出警告、该函数隐式声明。sqrtf#225-D <a href="file:/C:/ti/ccs1000/ccs/tools/compiler/dmed/HTML/225.html"> 函数"sqrtf"隐式声明


对于每个库函数、我可以看到这些警告出现了。 最初我们忽略了、但我注意到它开始在我的项目中造成问题。 它将给出未定义的符号链接问题、这些问题主要与 辅助函数有关。

是否有任何方法可以缓解此问题?

此外、在调用 libc.a (索引库)时、我无法看到相同问题的原因。

您能否提供任何最佳方法来避免遇到链接器问题?  

注意:我们不希望仅抑制警告。

此致

Gurusha

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

    确保看到诊断程序的源文件与...类似。

    [引用 user="gurusha Nahar"]隐式声明的函数"sqrtf"

    (笑声) #include 包含该函数声明的 RTS 头文件。  在本例中为#include

    请告诉我此建议是否解决了问题。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢您的回答!

    我在创建运行时库时包含了此头文件、在创建库期间会链接所有内容。

    并在我们的项目中集成了该库。 当我调用任何 RTL 函数时、例如 sqrtf()、我不应该在我的项目中获得隐式函数声明警告、对吧?

    请您向我解释一下为什么会发生这种情况。 我们是否缺少任何链接器设置?

    此外、我还会遇到一些 C 语言帮助程序函数链接问题、 SPRAC71A  的表5中提到了其中的大部分问题。 是否需要任何 RTL 设置、以便在项目链接时注意这些问题。

    谢谢

    Gurusha

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

    [引用 user="gurusha Nahar"]当我调用任何 RTL 函数(例如 sqrtf ())时,我不应该在项目中得到隐式函数声明警告,对吗?

    如果调用函数、并且看不到原型、则会得到有关隐式声明该函数的诊断。  编译器 RTS 库中实现的用户函数和函数都是如此。

    [引用 user="gurusha Nahar"]我们是否缺少任何链接器设置?

    该诊断与链接器设置无关。

    [引用 user="gurusha Nahar"]此外,我还会遇到一些 C 语言辅助函数链接问题, 其中大多数问题在 SPRAC71A  的表5中都有提及。

    请举例说明其中一个问题。  请显示完整的链接器调用和所有系统响应。  请复制并粘贴文本、不要使用屏幕截图。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    [引用 user="George mock"]编译器 RTS 库中实现的用户函数和函数都是如此。

    然后在项目中再次包含标题文件、不会使其变得多余。 为什么我们还需要在项目代码中再次包含 RTL 头文件? 我们是否可以使用任何替代方法。

    [引用 user="George mock]请展示其中一个问题的示例。  [/报价]

    现在我已经暂时解决了这些问题。 但我有一个问题。

    我参考了编译器手册 spru514v、 在这里我看到了8.1 C 和 C++运行时支持库中提到的这一点:

    编译器辅助函数(支持无法在 C/C++中直接高效表达的语言功能)

    如何实现这一点? 是否有任何设置可配置帮助程序函数?

    请帮助我理解这一点。

    谢谢

    此致

    Gurusha

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

    Gurusha、

    George 将在下周外出。  但是、我将尝试帮助您解决第一个问题。

    [引用 user="gurusha Nahar"]

    George Mock
    编译器 RTS 库中实现的用户函数和函数都是如此。

    然后在项目中再次包含标题文件、不会使其变得多余。 为什么我们还需要在项目代码中再次包含 RTL 头文件? 我们是否可以使用任何替代方法。

    [/报价]

    如果调用的函数是库(任何库)的一部分、甚至是在不同的源文件中、则需要包含具有函数原型的头文件。  否则、您将在构建时收到该隐式声明警告。  如果您曾看到该警告、您希望停止并修复它、因为您的程序将无法正常工作。

    以下是一些链接、可进一步解释这一点。

    https://myeasytuts.com/solved-implicit-declaration-of-function-in-c/

    https://stackoverflow.com/questions/8440816/warning-implicit-declaration-of-function

    https://www.quora.com/What-is-the-implicit-declaration-of-function

    至于第二个问题[引用 user="gurusha Nahar"]

    我参考了编译器手册 spru514v、 在这里我看到了8.1 C 和 C++运行时支持库中提到的这一点:

    编译器辅助函数(支持无法在 C/C++中直接高效表达的语言功能)

    如何实现这一点? 是否有任何设置可配置帮助程序函数?

    [/报价]

    这与上面类似。  如果要使用任何帮助程序函数、必须在源文件中包含相应的头文件。

    此致、

    John

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

    哦! 但最初我们假设的是、如果库函数调用已经与应用程序链接、那么我们不应该收到此警告。

    但是、既然您已确认、那么我们将再次在调用库函数的任何位置包含头文件。  

    此外[引用 user="Johes">这与上述内容类似。  如果要使用任何帮助程序函数、则必须在源文件中包含相应的头文件。

    不、这不是!

    如果您看到辅助函数、大多数情况下是某些 asm 文件的一部分。 我们无法在 RTL 中包含几乎所有的 asm 文件。

    当然、我们的 RTL 中有一些缺失的部件。

    乔治知道我们的地位,他可以帮助我们!

    我要做的是附加虚拟项目、我将获取该虚拟项目的辅助函数错误。

    请检查问题、并告诉我们此处缺少的内容。

    如果您构建虚拟项目、您还将获得该链接器错误。

    希望它能帮助您理解我的疑问!

    e2e.ti.com/.../Dummy_5F00_Proj.zip

    谢谢

    此致

    Gurusha

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

    要使用 logf(),请包含 math.h

    您还必须在此处添加包含搜索路径的必要路径:

    我添加了${CG_TOOL_ROOT}/include、而不是使用绝对路径。  ${CG_TOOL_ROOT}解析为编译器的安装位置、math.h 位于该文件夹下的/include 文件夹中。

    此致、

    John

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

    您好!

    共享此项目的目的是向您展示我遇到的链接器问题。 对于该项目、我们可以通过插入头文件来解决它。 但对于我们的项目、我们以相同的方式尝试、但仍然遇到编译问题。 我正在尝试创建相同的方案。 我将发布确切的问题。 我唯一关心的是 第71a 条中的陈述。   在第31页的第6.2节中,它指出:

    "编译器生成对辅助函数的调用、以执行编译器需要支持但架构不直接支持的运算、例如缺少专用硬件的器件上的浮点运算。 这些辅助函数必须在任何符合 ABI 的工具链的 RTS 库中实现"

     

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

    Gurusha、

    乔治将于周一回来,然后可以作出回应。

    此致、

    John

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

    感谢您提交测试用例项目。   

    项目中的代码不包含头文件、并且声明没有函数原型。  它包括一条类似于...的线。

    float_var1 = logf (float_var2); 

    由于存在 logf 可见的原型、编译器不知道 logf 期望的参数类型为 float。  相反、编译器使用默认惯例将点表达式传递到函数、即将其转换为双精度型。  因此、编译器会生成将 float_var2 float 转换 double 的代码。  此生成的代码调用 RTS 中名为__c28xabi_ftod 的函数。 请注意、这不是 strcpy 之类的用户级函数、而是编译器根据需要调用的辅助函数。  项目中的所有库都不提供函数__c28xabi_ftod。  因此工程无法成功链接。

    通过添加此行...

    #include 

    (笑声) logf 的原型变为可见。  这意味着编译器知道 logf 的参数 float 类型、而不是 double 类型。  因此、它不会生成将 float_var2 float 转换 double 的代码。  由于不存在对函数_c28xabi_ftod 的调用、因此工程编译成功。

    这种情况很好地说明了为什么有必要确保对用户函数和 RTS 函数的每个函数调用都具有可见的有效函数原型。

    谢谢、此致、

    乔治