我正在使用 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]' of /home/nghia/Documents/catkin/Firmware/Build/px4fmu-v2_default.build//home/nghia/Documents/catkin/Firmware/src/modules/state_machine_boost/module.pre.o: defined in discarded section `.rodata._ZTIN5boost12noncopyable_11noncopyableE[_ZTIN5boost12noncopyable_11noncopyableE]' of /home/nghia/Documents/catkin/Firmware/Build/px4fmu-v2_default.build//home/nghia/Documents/catkin/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;
最佳答案
原来问题出在另一个包含 Boost Statechart 的模块上。删除其他模块中与 Boost 相关的代码可解决所有编译错误。我猜链接器不喜欢在不同的目标文件中看到多个 Boost 模板实例。
关于c++ - gcc Boost 模板结果为 "defined in discarded section",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30629057/