【问题标题】:gcc Boost template results in "defined in discarded section"gcc Boost模板导致“在丢弃的部分中定义”
【发布时间】:2015-08-18 04:36:39
【问题描述】:

我正在使用 gcc 4.7.4 20140401 为嵌入式 ARM Cortex M4 (Pixhawk) 进行交叉编译。我正在尝试让 Boost Statechart 正常工作,但遇到了一个我无法解决的错误。下面是其中之一,这样的还有很多。

_ZTIN5boost12noncopyable_11noncopyableE' referenced in section .rodata._ZTIN5boost10statechart13state_machineI15PositionControl15HoldingPositionSaIvENS0_25null_exception_translatorEEE [_ZTIN5boost10statechart13state_machineI15PositionControl15HoldingPositionSaIvENS0_25null_exception_translatorEEE]” /home/nghia/Documents/catkin/Firmware/Build/px4fmu-v2_default.build//home/nghia/Documents/catkin/Firmware/src/modules/state_machine_boost的/module.pre.o:在 /home/nghia/Documents/catkin/Firmware/Build/px4fmu-v2_default.build//home/nghia/Documents/catkin/Firmware 的废弃部分 `.rodata._ZTIN5boost12noncopyable_11noncopyableE[_ZTIN5boost12noncopyable_11noncopyableE]' 中定义/src/modules/state_machine_boost/module.pre.o

我已经阅读了有关“在废弃部分中定义”的所有 Stackoverflow 帖子,但没有找到任何可行的解决方案。这包括启用/禁用 -ffunction-sections、-fdata-sections、--gc-sections、优化标志和重新排序模块。

Boost Statechart 大量使用模板,我怀疑这是导致问题的原因。 gcc 是否优化了它认为没有被使用的东西?

更新: 我设法想出了一个触发上述错误的最小示例:

class dummy : boost::noncopyable
{
public:
    int x;    
};

static dummy g_dummy;

【问题讨论】:

    标签: c++ templates gcc boost


    【解决方案1】:

    原来问题出在另一个包含 Boost Statechart 的模块上。删除其他模块中的 Boost 相关代码可以解决所有编译错误。我猜链接器不喜欢在不同的目标文件中看到多个 Boost 模板实例。

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2016-09-04
      • 1970-01-01
      • 2012-04-06
      • 2015-04-26
      • 2013-11-03
      • 2018-04-10
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多