Результаты шаблона 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: определено в удаленном разделе `.rodata._ZTIN5boost12noncopyable_11noncopyableE[_ZTIN5boost12noncopyable_11noncopyableE]' файла /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;

person Nghia    schedule 03.06.2015    source источник


Ответы (1)


Оказывается, проблема связана с другим модулем, который включал Boost Statechart. Удаление кода, связанного с Boost, в другом модуле устраняет все ошибки компиляции. Я предполагаю, что компоновщику не нравится видеть несколько экземпляров шаблонов Boost в разных объектных файлах.

person Nghia    schedule 03.06.2015