c++ - gcc Boost 模板结果为 "defined in discarded section"

标签 c++ templates gcc boost

我正在使用 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/

相关文章:

c++ - 在从未实例化的模板中错误使用非相关名称是否需要诊断?

c++ - 如何在运行时恢复函数指针的类型

c - 为什么 scanf() 函数打印到我的标准输出流?我该如何抑制这种行为?

c++ - OpenSSL 文件传输

c++ - 如何使用 Media Foundation 或 DirectShow 等 Windows 媒体 API 检测相机帧丢失?

c++ - 在 Linux 上调试 C/C++ 运行时库并查看库代码?

c++ - 如何从模板类型数组中获取整数类型

gcc/ld 链接时不遵循符号链接(symbolic link)文件

linux - 从任何目录加载共享库

c++ - 将数组重新解释为包含该数组的结构是否安全?