Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Igors от Октябрь 16, 2014, 15:59



Название: Криво "собралась"
Отправлено: Igors от Октябрь 16, 2014, 15:59
Добрый день

Крашится на первой строчке в main (INVOP_)
Код
C++ (Qt)
float val = std::numeric_limits<float>::infinity();

В asm виден вызов numeric_limits, но там мусор. Подозреваю что-то типа "libstdc++ вместо libstdc", но как это грамотно определить - ну и конечно вылечить?

Спасибо


Название: Re: Криво "собралась"
Отправлено: Igors от Октябрь 16, 2014, 19:08
Сделал др проект в котором все норм и сравнил link map файлы. В обоих случаях никакого внешнего вызова dylib/dll не происходит, тело ф-ции как бы всасывается (ну или "биндится") в тот объектный файл где был вызов (хотя и не инлайнится), иногда в master файл.

Беда в том что одна из либов компилируется с опцией -xAVX, т.е. с расширенным набором команд (для крутых машин). Mangled имя везде одинаковое, ну линкер и оставляет одну (c avx реализацией). Хмм... как же ему сказать что вызовы std разные?


Название: Re: Криво "собралась"
Отправлено: Igors от Октябрь 17, 2014, 16:35
Помаленьку проясняется: баг компилятора. Попробовал поменять ф-ции вызывающие краш - ситуация меняется, и "калечных" вызовов std вроде немного. Тут пошел случай достойный пера Шекспира
Код
C++ (Qt)
// оригинал, крашится
__forceinline BBox& operator=( const BBox& other ) { lower = other.lower; upper = other.upper; return *this; }
 
    
Код
C++ (Qt)
// так все равно крашится
BBox& operator=( const BBox& other ) { lower = other.lower; upper = other.upper; return *this; }
 
    
Код
C++ (Qt)
// а так РАБОТАЕТ!!!
BBox& operator=( const BBox& other )
{
 lower = other.lower;
 upper = other.upper;
 return *this;
}
 
"Уссышься про любовь"  >:(