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.

[参考译文] Compiler/CC3200:使用最新的ARM编译器编译源代码时出现问题

Guru**** 2540720 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/580378/compiler-cc3200-issue-in-compiling-the-source-code-with-the-latest-arm-compilers

部件号:CC3200

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

我们目前在尝试编译ARM TI编译器(即16.12)时遇到问题。 0STS (短期支持),但出现以下错误。

注意: 我们使用代码编写器工作室开发环境进行编译。

链接>

错误:符号"errno"已定义

>>编译失败

>>编译失败

>>编译失败


我们尝试了以下措施:

  • 在ARM编译器5.2 9发行版之后,使用所有编译器版本进行了测试,没有任何运气。
  • 未在项目属性中定义宏,但它不起作用。
  • 已禁用“errno”宏,方法是将    以下文件中的#ifndef _errno更改为#ifdef _errno,以便 禁用#define errno,但这不起作用。

C:16.12 \ti\ccsv6\tools\compiler\ti-CGT-arm_STS.0\include\errno.h

C:16.12 \ti\ccsv6\tools\compiler\ti-CGT-arm_STS.0\libs\src\errno.h

 C:16.12 \ti\ccsv6\tools\compiler\ti-CGT-arm_STS.0\libs\src\errno.h  

我们还尝试了最新的长期支持(16.9 .0LTS)编译器,但出现了相同的编译错误。

目前我们认为“errno”是在 以下  文件夹位置的“rtsv7M4_T_le_eabi lib”库中定义的,但是我们无法从该库中禁用此宏。

 C:\ti\ccsv6\tools\compiler\ti-CGT-arm_arm_lib.sts\lib\ 16.12 rtsv7M4_T_le_eabi lib

 如何为无错误编译禁用此宏?

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

    我以前从未见过这种情况。  我不知道是什么原因造成的。  但我很难看到它是如何从RTS库中产生的。  我的猜测(这只是猜测)是您自己的代码中有多个errno定义。  但你怎么看呢?

    首先,在C/C++文件中的任何位置搜索errno。  这很可能不会有任何结果。  然后使用开关 --gen_preprocessor_listing.  此开关使编译器创建扩展名为.RL的预处理程序列表文件。  除其他外,此文件还显示发生预处理程序扩展之前和之后的源代码行。  我怀疑您会发现errno的多个定义。

    请勿将定义与声明混淆。 除了许多细节,这是一个定义...

    Int errno;/*定义*/ 

    这是一项声明.

    extern int errno;/*声明*/ 

    找到这些多个定义后,您应该能够追溯预处理过程,以发现它是如何发生的。

    请阅读 ARM编译器手册中的--gen_preprocessor_listing. 很遗憾,手册有错误。  它使用--gen_parser_listing,其中--gen_preprocessor_listing应改为使用。

    谢谢,此致,

    -George

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

    项目已经定义了errno,我们无法更改它,因为它的使用在我们要包括的预构建lib对象中。

    这不会导致使用5.2 9及更早版本的TI ARM编译器编译或运行我们的代码时出现任何问题。

    在尝试使用较新的编译器(特别是16.12 .0STS版本)编译代码后,我们开始遇到问题。

    从我们收到的错误来看,新版本似乎还在编译器使用的某些库中内置了errno的定义。

    我想知道我们是否可以做些什么来删除新编译器使用的errno定义的包含。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    简短回答:不,如果没有重大修订,您不能修改或删除库中的errno。

    答案很长:

    ARM EABI为使用errno定义了两种模式:正常模式和AEAABI便携式模式。 请参阅ARM文档“C Library ABI for the ARMRegisteredArchitecture”(ARM IHI 0039D),网址 为infocenter.arm.com/.../index.jsp

    基本上,如果您添加_AEABI可移植性级别的定义:

    #define _AEABI可移植性1级

    您可以更改errno的声明方式。 您正在使用的预构建库可能已完成此操作。 如果是这样,则需要编译代码才能匹配。 TI RTS库也可能需要重新编译,我不确定。