buggins / coolreader

Official site of CoolReader project. Sourceforge repository is obsolete.
GNU General Public License v2.0
386 stars 101 forks source link

Ошибка компиляции при сборке на архитектуре e2k компилятором lcc #228

Open neurofreak-alt opened 3 years ago

neurofreak-alt commented 3 years ago

Вывод компилятора:

[ 87%] Building CXX object cr3qt/CMakeFiles/cr3.dir/src/crqtutil.cpp.o
lcc: "/export/home/nightscreamer/sources/coolreader/cr3qt/src/crqtutil.cpp", строка 14: ошибка #167:
          аргумент типа "const lString32::value_type *" несовместим с
          параметром типа "const uint *"
      return QString::fromUcs4(str.c_str(), str.length());
                               ^

1 ошибка обнаружено при компиляции "/export/home/nightscreamer/sources/coolreader/cr3qt/src/crqtutil.cpp".
make[2]: *** [cr3qt/CMakeFiles/cr3.dir/build.make:497: cr3qt/CMakeFiles/cr3.dir/src/crqtutil.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:405: cr3qt/CMakeFiles/cr3.dir/all] Ошибка 2
make: *** [Makefile:130: all] Ошибка 2

В чём может быть проблема?

virxkane commented 3 years ago

This is what I found in qtsring.h:

    static QString fromUtf16(const ushort *, int size = -1);
    static QString fromUcs4(const uint *, int size = -1);
    static QString fromRawData(const QChar *, int size);

#if defined(Q_COMPILER_UNICODE_STRINGS)
    static QString fromUtf16(const char16_t *str, int size = -1)
    { return fromUtf16(reinterpret_cast<const ushort *>(str), size); }
    static QString fromUcs4(const char32_t *str, int size = -1)
    { return fromUcs4(reinterpret_cast<const uint *>(str), size); }
#endif

I can assume that the compiler does not support the C11 standard (iso9899:2011) or this support not enabled. You can try adding the appropriate option to CMakeLists.txt for the lcc compiler to enable C11 support, if there is one. Somewhere here: https://github.com/buggins/coolreader/blob/fa832c18c1f075c07627e22f285a2da186a854c6/CMakeLists.txt#L39-L52 Or you can try with following patch:

diff --git a/cr3qt/src/crqtutil.cpp b/cr3qt/src/crqtutil.cpp
index 20e7dffbb..d0abba711 100644
--- a/cr3qt/src/crqtutil.cpp
+++ b/cr3qt/src/crqtutil.cpp
@@ -11,7 +11,7 @@ lString32 qt2cr(QString str)

 QString cr2qt(lString32 str)
 {
-    return QString::fromUcs4(str.c_str(), str.length());
+    return QString::fromUcs4((const uint *)str.c_str(), str.length());
 }

 class CRPropsImpl : public Props
virxkane commented 3 years ago

https://www.altlinux.org/Эльбрус/lcc But I think you've seen that.

neurofreak-alt commented 3 years ago
return QString::fromUcs4((const uint *)str.c_str(), str.length());

Применил патч, и теперь появились другие ошибки. Использую компилятор МЦСТ lcc версии 1.25, который по умолчанию использует стандарт С++14. Здесь описание компилятора.

Ошибки:

[ 77%] Building CXX object cr3qt/CMakeFiles/cr3.dir/src/settings.cpp.o
lcc: "/export/home/nightscreamer/sources/coolreader/qtbuild/cr3qt/ui_settings.h", строка 1445: ошибка #135:
          класс "QComboBox" не имеет члена "setCurrentText"
          cbFontShaping->setCurrentText(QApplication::translate("SettingsDlg", "Simple (FreeType only, fastest)", 0, QApplication::UnicodeUTF8));
                         ^

lcc: "/export/home/nightscreamer/sources/coolreader/cr3qt/src/settings.cpp", строка 190: предупреждение #1873:
          сравнение знакового и беззнакового операндов [-Wsign-compare]
      for (int i = 0; i < MAX_REND_FLAGS_INDEX; i++) {
                        ^

lcc: "/export/home/nightscreamer/sources/coolreader/cr3qt/src/settings.cpp", строка 200: предупреждение #1873:
          сравнение знакового и беззнакового операндов [-Wsign-compare]
      for (int i = 0; i < MAX_DOM_VERSIONS_INDEX; i++) {
                        ^

lcc: "/export/home/nightscreamer/sources/coolreader/cr3qt/src/settings.cpp", строка 1150: предупреждение #1873:
          сравнение знакового и беззнакового операндов [-Wsign-compare]
      if (index < 0 || index >= MAX_REND_FLAGS_INDEX)
                             ^

lcc: "/export/home/nightscreamer/sources/coolreader/cr3qt/src/settings.cpp", строка 1174: предупреждение #1873:
          сравнение знакового и беззнакового операндов [-Wsign-compare]
      if (index < 0 || index >= MAX_DOM_VERSIONS_INDEX)
                             ^

1 ошибка обнаружено при компиляции "/export/home/nightscreamer/sources/coolreader/cr3qt/src/settings.cpp".
make[2]: *** [cr3qt/CMakeFiles/cr3.dir/build.make:601: cr3qt/CMakeFiles/cr3.dir/src/settings.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:405: cr3qt/CMakeFiles/cr3.dir/all] Ошибка 2
make: *** [Makefile:130: all] Ошибка 2
mikhailnov commented 3 years ago

Все-таки лучше не надеяться на дфеолты в компиляторе и задать в явном виде: %global optflags %{optflags} -std=c++14

mikhailnov commented 3 years ago

А ошибки типа -W* обходятся убиранием -Wall или добавлением -Wno-all во флаги компилятора

Nable80 commented 3 years ago

Не надо компилятор затыкать, он всегда дело говорит. К сожалению, опции -Wall -Wextra не всю полезную диагностику включают, приходится ещё досыпáть кучу флагов.

Про инициативу и инициатора поговорку помню, над патчами подумаю, но ничего обещать пока не могу.