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.

[参考译文] 编译器/LAUNCHXL-F28377S:为什么从 rts2800_fpu32.lib 链接_printfi.obj?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/598085/compiler-launchxl-f28377s-why-is-_printfi-obj-being-linked-from-rts2800_fpu32-lib

器件型号:LAUNCHXL-F28377S

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

具体而言、我不使用 stdout printf 函数。 (实际上、stdout 根本不包括在内)。 然而、我注意到在映射文件中 、_printfi.obj 显示在/ccsv7/tools/compiler/ti-cgt-C2000-16.9.1.sps/lib/rts2800_fpu32.lib 下。 它占用3094字节、这并不是总使用数的一小部分。

但是、我不确定如何跟踪可能导致这种情况的原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将此主题移至 TI C/C++编译器论坛

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

    谢谢!  尽管编译器标志从未出现、但 CCS 中的语言选项(在 C2000编译器下)确实具有" printf 支持级别"。 遗憾的是、无法选择空白选项。 最小选项确实会显著减少浪费的空间。 但是、当我不调用任何函数时、我很好奇为什么 RTS 库会自动包含这么多内容。

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

    [报价用户="Adam Jones"]但我不确定如何跟踪导致这种情况的原因。

    printfi.obj 中的函数由 printf 系列的所有成员使用。  我建议您搜索链接器映射文件以查看它是哪一个。  在 CCS 工程中、映射文件位于名为 Debug 或 Release (或任何当前编译配置)的文件夹中、称为 project.map。  知道函数的名称后、请搜索所有源代码以找到该函数。 头文件也是如此。

    虽然我很确定这项建议是否可行、但不能保证。  如果它不能解决问题、请告诉我们您发现了什么。  我相信我们会跟踪它。

    谢谢、此致、

    乔治

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

    谢谢 你、George、再次与我联系。

    我已使用我包含的所有标题(甚至是在同一文件夹中关联的标题)完成了全文搜索。 有两个 IQmath 头文件引用了 printf -我现在已将其删除。 现在、在 ccsv7/tools/compiler/ti-cgt-C2000-16.9.1.sps/include 中有大量 printf 引用。 但是、我没有在我自己的代码中包含这些头文件中的任何一个。 我也不调用 printf 或它的任何相关函数。

    我应该补充的是、我正在使用一个类似 printf 的实现、该实现是从 GitHub (xformatc、适用于感兴趣的人)获得的、然后我将其打包到名为 printf 的函数中(只是为了熟悉)。 但是、我不会在任何地方调用 stdio。

    我一直在使用映射文件执行许多操作、因此我知道如何导航它 (我希望我在本周早些时候能想到、当我跟踪一个错误时、CLA 无法从我在 pragma DATA_SECTION 中输入错误的变量中读取)。 任何方式。 有52个 obj 正在从 rts2800_Fpu.lib 进行编译(使用6k)、但我无法分辨为什么选择它们。 我刚才引用了这些内容、如下所示:

              00014e38  00000014  rts2800_fpu32.lib:_printfi_min.obj (.econst:.string)

             00014e4c  00000014            :strtod.obj (.econst:_digits)

    此时、可能是因为它仅使用6k、我应该保留它。 我真的很好奇为什么所有这些代码都包含在其中、我不会直接调用这些代码

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

    下面是另一种查看_printfi*.obj 中函数调用情况的方法。  此命令从 Windows 命令行运行。  它应用于由您的项目创建的最终链接.out 文件。

    C:\path\to \project>nm2000 file.out |查找"print" 

    命令 nm2000转储可执行文件中的所有符号。  Windows 命令"查找"筛选包含文本"打印"的所有符号。  这将向您展示哪个 printf 变体正在使用_printfi 函数。

    有关 nm2000的更多背景信息... 这是名称实用程序。  它是编译器工具提供的另一个可执行文件。  请在 C2000汇编工具手册中阅读有关该工具的更多信息

    很抱歉、我没有早点想到这个想法。

    谢谢、此致、

    乔治

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

    乔治

    谢谢你。 输出文件显示的结果与映射文件相同、_ _TI_printfi_minimal 和 _fprintf 都位于编译的文件中(以及 _ fputc、 _fputs 和我的代码未调用的数十个其他函数)。 查看 rts2800_fpu32.lib 的文档以及它提到可以编译自己的版本这一事实、我认为链接器会自动包括库中的所有内容、无论它是否从源代码调用。 这似乎是一个巨大的浪费、就像 printf-minimal 一样、这是我没有调用的~6k 函数。

    -Adam

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

    [报价用户="Adam Jones"] __TI_printfi_minimal 和 _fprintf 都位于编译的文件中

    这意味着您的代码会调用 fprintf。  搜索您的所有源代码和头文件、查找 fprintf。

    如果没有结果显示任何内容、则下面将介绍如何展开搜索。  使用 --gen_preprocessor_listing 重新生成所有内容。  这会为每个 C 文件生成预处理器列表文件。  文件扩展名从.c (或.cpp)更改为.rl。  在 C2000编译器手册中阅读有关--gen_preprocessor_listing 选项的更多信息。  在所有.RL 文件中搜索 fprintf。  这将显示呼叫的来源。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    乔治,好吧… 添加该选项后、RAM 和闪存映射文件都显示 fprintf 和 printfi_minimal 已消失。 因此、我检查了 git 历史记录、再说一次、我之前或之后都没有 stdio printf。 我甚至尝试将-my- printf 函数重命名为 print_f、但两个 RTS 对象仍在显示。 所以、我不知道发生了什么、但 RTS 库占用的空间大约是它的1/3、其中既不包括 printf。

    谢谢。。。 不过,我希望我能理解实际修正的内容。