Почему флаги оптимизации вызывают ошибки компоновщика для некоторых функций шаблона? - PullRequest
4 голосов
/ 26 июля 2011

У меня проблема с тем, что приложение прекрасно компилируется в режиме отладки с отключенной оптимизацией.Но в тот момент, когда я компилирую его, он выводит неразрешенные ошибки ссылок.

Рассматриваются следующие функции:

template <typename T>
T & Block::val(size_t offset) 
{
    return *(reinterpret_cast<T*>(_data + offset)); 
}

template <typename T>
const T & Block::val(size_t offset) const 
{ 
    return *(reinterpret_cast<T*>(_data + offset)); 
}

И все ошибки, которые я получаю, выглядят так:

undefined reference to `unsigned long long& Block::val<unsigned long long>(unsigned long)'

Что может быть причиной этого?

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Обычно вы бы не помещали реализации шаблонов в .cpp, а скорее в .h или .inl, который включен из .h, возможно, что отладочная сборка .o более либеральна с символами, которые она экспортирует..

Запустите nm в сборках отладки и выпуска .o и разведите символы.

Шаблоны необычны в компоновщиках из-за правила единого определения.Когда дело доходит до шаблонов, где тело находится в заголовке, это приводит к множественным эквивалентным определениям, по одному на каждую единицу перевода.Компоновщик позволяет им оставаться до последнего момента, когда он произвольно выбирает один и отбрасывает остальные.

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

Поиск внешние шаблоны .

2 голосов
/ 26 июля 2011

Странно, перемещая их из исходного файла в файл заголовка, и он прекрасно компилируется.

Это не странно, ни в малейшей степени.Определения шаблонов функций относятся к заголовочным файлам с первого дня.Не помещайте их в источники.Если вы это сделаете, компилятор не увидит их во время создания экземпляра.

...