gcc Boost模板导致“在丢弃的部分中定义”

时间:2015-06-03 19:34:08

标签: c++ templates gcc boost

我正在使用gcc 4.7.4 20140401来交叉编译嵌入式ARM Cortex M4(Pixhawk)。我正试图让Boost状态图工作,我遇到了一个我无法解决的错误。下面是他们中的一个,有很多这样的。

  

_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的废弃部分`.rodata._ZTIN5boost12noncopyable_11noncopyableE [_ZTIN5boost12noncopyable_11noncopyableE]中定义/Firmware/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;

1 个答案:

答案 0 :(得分:0)

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