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.

[参考译文] 编译器/TMS320C28346:重新定义链接器错误#10056初始化保护变量

Guru**** 2445440 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/725065/compiler-tms320c28346-linker-error-10056-initialization-guard-variable-redefined

器件型号:TMS320C28346

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

我在标头中有一个内联函数:

模板 
内联 bool 具有 FeatureBuffed()
{
静态 bool const 功能可用性=
hasFeature (getFeatureClass(Class),索引);
返回可用功能;
} 

我会遇到一组错误:

错误#10056:符号"bool 的初始化保护变量
  FeaturehasBuffered ()[使用 N1=(unsigned int) 8、N2=(unsigned
  Int)52]::featureAvailable"重新定义:首次在中定义
  "./ServoLibrary/service/sensor/ProxiedAdConverter.obj;在中重新定义
  "./application/InverterSettings.obj
错误#10056:符号"bool 的初始化保护变量
  FeaturehasBuffered ()[使用 N1=(unsigned int) 8、N2=(unsigned
  Int)45]::featureAvailable"重新定义:首先在中定义
  "./ServoLibrary/service/timing/timing_unit/CTimingUnit.obj;在中重新定义
  "./platform/servo/common/application/tasksIsd510.obj

我现在一直在 C2000 6.1.0上。

在我看来、链接器无法合并来自不同翻译单元的 featureAvailable 实例。 我对语言的理解是 inline 关键字会使 ODR 无效、链接器必须合并这些实例。

由于 hasFeature ()调用没有副作用,因此一种解决方案(在此处可行)是将其设为静态内联。 但是、在标头中声明静态函数是一个忽略的潜在目标、并且内存浪费至少是令人厌恶的。

这种难题是否有一种巧妙的解决方案?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    事后、我希望在编写该代码时收到#1369警告。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Dominic Fandrey"]是否有一种巧妙的方法可以摆脱这种难题?

    不幸的是、不  文章 C++内联问题中讨论了您的问题。  请注意、由于您是为 C28x 构建的、因此本文适用于您。  它不适用于 ARM、C6000、MSP430或 PRU 器件的用户。

    为模板案例提供的变通办法假定问题静态变量位于模板类的成员函数内。  在这种情况下、解决方案是将静态变量移出到类中、其中静态变量是类的静态数据成员。  没有为您显示的非类模板函数提供解决方案。  我假设您显示的是实际问题的削减、实际上有一个模板类可以容纳静态数据成员。

    谢谢、此致、

    乔治

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

    [引用 user="Dominic Fandrey"]事后,我希望在编写该代码时收到警告#1369。

    对于后续操作的人员、在链接之前构建 C++源文件时会出现警告#1369。  看起来像...

    "hdr.h"、第4行:警告#1369-D:extern 内联函数的静态局部变量未解析为单个副本。 不符合 ANSI C++标准
    在“bool hasFeatureBuffered”实例化期间检测到 ()[Class=8U、Index=32U]"、位于"T2.CPP"的第5行 

    当我根据您的示例构建玩具测试案例时、我会收到此警告。  因此、我不知道您为什么看不到它。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目前没有类。 我可以绕过它、但我认为静态类成员是在全局对象初始化期间构建的、这一定不会发生、因为检索到的信息尚不可用。

    必须在首次调用期间初始化静态变量。

    现在、我将声明函数为静态、因此我将为每个转换单元提供一个值副本、现在这似乎是最不好的选择。