Olej писал(а):А здесь пусть остаются (продолжаются) вопросы использования Clang.
Снова возникла возможность вернуться к Clang:
- подбросили мне проработать проект, алгоритмика описана, из области обработки речи, распознавание...
- нужно набросать хотя бы прототип...
- начал я прописывать это на C (GCC) ... но просидев над этой сигнальной обработкой 3-4 дня полных, вижу, что таким инструментом я это даже на уровне работающего прототипа буду делать 2-3 мес. ... не годится ...
- взял, и переписал всё сделанное на С - в С++, STL и вектора для представления сигнальных последовательностей ...
- и раз уж так всё повернулось, то параллельно решил прокатывать всё это и в Clang с тем, чтобы потом сравнить по производительности кода и т.д., а задача как-раз очень способствующая оценкам производительности, там очень много цифровой фильтрации, да ещё многоканальной, на длинных эталонных .wav последовательностях...
И первое на что я напоролся (анекдот!) это ошибка такого рода:
- компилируем то что уже есть в объектные файлы:
Код: Выделить всё
bash-4.2$ make -f Makefile.clang
clang -c -xc++ -w -std=c++11 LyonCommon.cc -o LyonCommon.o
clang -c -xc++ -w -std=c++11 SecondOrderFilter.cc -o SecondOrderFilter.o
clang -c -xc++ -w -std=c++11 DesignLyonFilters.cc -o DesignLyonFilters.o
- после этого хочу всё это собрать с единой тестовой задачей LyonTests.cc (что вполне нормально для GCC) ... но получается огромный лист предупреждений (что и рассмотреть их нельзя) + ошибок, даже если запретить все предупреждения:
Код: Выделить всё
bash-4.2$ clang -w -xc++ -lstdc++ LyonTests.cc LyonCommon.o DesignLyonFilters.o SecondOrderFilter.o -o LyonTests
LyonCommon.o:1:1: error: expected unqualified-id
<U+007F>ELF<U+0001><U+0001><U+0001><U+0003>
^
LyonCommon.o:11:580: error: extraneous closing brace ('}')
...}
^
LyonCommon.o:11:597: error: unknown type name 'U'
...U<89><E5>V<83><EC>$<8B>E<U+0010><8B>M...
^
LyonCommon.o:11:598: error: expected unqualified-id
...<89><E5>V<83><EC>$<8B>E<U+0010><8B>M...
^
4 errors generated.
Как оказалось (убил на это кино часа 3 времени!), Clang в этом случае (из-за множества понимаемых ним языков) указание -xc++ воспринимает буквально, и объектные файлы .o тоже хочет перекомпилировать по 2-му разу как C++ код
.
Убираем -xc++ с линковки и всё становится на место:
Код: Выделить всё
bash-4.2$ clang -c -xc++ -w -std=c++11 LyonTests.cc -o LyonTests.o
clang LyonTests.o LyonCommon.o SecondOrderFilter.o DesignLyonFilters.o -lstdc++ -lm -o LyonTests
И всё ОК!
Вот такое вот кино...
Кстати, вторая библиотека то, libm.so - GNU-шная что ни на есть! Т.е. кроме замены libc++.so на libstdc++.so, со всеми прочими DLL по совместимости проблем нет.
P.S. Время не напрасно убил: проектик уже достаточно объёмный, со сложными классами и наследованием ... но по совместимости полетел влёт!