LINUX.ORG.RU

ошибка сборки slackware-14.2+ trinity-3.5.13.2 (mini kde3/qt3)

 , ,


0

1

на Slackware 14.2 - собирается без проблем

на Slackware 14.2+ - ошибка

### Ошибка 1 ###

In file included from /usr/include/c++/9.2.0/cstdlib:77,
                 from /usr/include/c++/9.2.0/stdlib.h:36,
                 from /usr/include/glib-2.0/glib/gutils.h:310,
                 from /usr/include/glib-2.0/glib/gthread.h:34,
                 from /usr/include/glib-2.0/glib/gasyncqueue.h:32,
                 from /usr/include/glib-2.0/glib.h:32,
                 from /dev/shm/x/arts-trinity-3.5.13.2/flow/gsl/gsldefs.h:24,
                 from /dev/shm/x/arts-trinity-3.5.13.2/flow/gsl/gslcommon.h:22,
                 from /dev/shm/x/arts-trinity-3.5.13.2/mcop_mt/threads_posix.cc:335:
/usr/include/c++/9.2.0/bits/std_abs.h:52:11: error: ‘::abs’ has not been declared
   52 |   using ::abs;
      |           ^~~

### Ошибка 2 kdelibs ###

/dev/shm/x/kdelibs-trinity-3.5.13.2/kate/part/katebuffer.cpp: In member function ‘void KateBuffer::updatePreviousNotEmptyLine(KateBufBlock*, uint, bool, uint)’:
/dev/shm/x/kdelibs-trinity-3.5.13.2/kate/part/katebuffer.cpp:920:82: error: call of overloaded ‘abs(unsigned int&)’ is ambiguous
  920 |   while ( (foldingList.size()>0)  && ( std::abs(foldingList[foldingList.size()-2])==1)) {
      |                                                                                  ^
/dev/shm/x/kdelibs-trinity-3.5.13.2/kate/part/katebuffer.cpp:920:77: error: call of overloaded ‘abs(unsigned int&)’ is ambiguous
  920 |   while ( (foldingList.size()>0)  && ( abs(foldingList[foldingList.size()-2])==1)) {
      |                                                                             ^

если не сложно, обьясните, что «тут» может неправильного в использовании функции (или макроса, не разбирался пока)? что тут не так?

оба вызова одинаково выдают одну ошибку

abs(...)
std::abs(...)

### Ошибка 3 kdebase ###

/usr/lib64/qt3/include/ksslcertificate.h:61:7: error: using typedef-name ‘X509’ after ‘class’
   61 | class X509;
      |       ^~~~

...

Slackware 14.2+

TDE Trinity-3.5.13.2 (минимальная сборка окружения KDE3/QT3)

★★★★

Последнее исправление: sunjob (всего исправлений: 6)

#include <stdlib.h>

Имеется?

Если я правильно помню, ::abs в stdlib.h, тогда как std::abs в cstdlib. Попробуй поиграться и подобавлять #include <stdlib.h>/#include <cstdlib> в файл arts-trinity-3.5.13.2/mcop_mt/threads_posix.cc.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Имеется?

Судя по выхлопу, один включает другой.

In file included from /usr/include/c++/9.2.0/cstdlib:77,
                 from /usr/include/c++/9.2.0/stdlib.h:36,


Но включение вполне может быть внутри namespace std { ... } (что соответствует разнице ::abs v. std::abs), сейчас негде глянуть и проверить.

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)
Ответ на: комментарий от EXL

::abs & std::abs

пробовал, но ошибка та-же...

очевидно, проблема в «новом окружении сборки» хотелось бы понять/услышать хотя-бы мысли/мнения что такое «случилось» с окружением/компилятором, что старые проекты «накрываются»...

add : нарисовалась вторая «подобнаЯ» ошибка, обновил топик

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 1)

error: call of overloaded ‘abs(unsigned int&)’ is ambiguous

Нет смысла вызывать abs( ... ) для беззнакового аргумента (unsigned ...).


TQMemArray<uint> foldingList=textLine->foldingListArray();

То есть,
foldingList[...] — беззнаковый, а потому
abs( foldingList[...] ) — не имеет смысла

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)

Но по логике исполнения избавиться от abs() нельзя из-за:

void KateBuffer::addIndentBasedFoldingInformation(TQMemArray<uint> &foldingList,bool addindent,uint deindent)
{
  //...
    for (uint z= foldingList.size()-(deindent*2); z < foldingList.size(); z=z+2)
    {
      foldingList[z] = -1;  // беззнаковая (-1)
      foldingList[z+1] = 0;
    }
  }
}

Поэтому в TDE поменяли вызов на labs( ... ):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/tree/kate/part/katebuffer....
Однако тем самым внесли ошибку. С labs() изменилась логика: беззнаковый аргумент расширяется до знакового большей разрядности, становится (-1)u. А первоначальная логика расчитана на потерю «знаковости», на то, что после abs() аргумент (-1)u == 0xffffffff станет равен 1, а не 0xffffffff.

Поэтому скажем дружное «фи» товарищу Slávek Banko за такое «исправление» (компилируется, но не работает как задумано):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/commit/kate/part/katebuffe...

#include <iostream>

int main()
{
    unsigned int i=-1;
    std::cout << "before: " << abs(i) << "  after: " << labs(i) << "\n";
}

before: 1  after: 4294967295


То есть исправлять-то нужно было на
  while ( (foldingList.size()>0)  && ( abs((int)foldingList[foldingList.size()-2])==1)) {

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 4)
Ответ на: комментарий от bormant

я пока подхерантил по другому

define ABS(N) ((N<0)?(-N):(N))
...
while ( (foldingList.size()>0)  && ( ABS(foldingList[foldingList.size()-2])==1)) {

ваши мысли, хуже/лучше, правильно/нет?

и что по поводу 2й части «типа патча» (я пока отрубил его)

@@ -122,7 +122,7 @@ class KateFileLoader
           if ((c >= 2) && (m_codec->mibEnum() == 1000) && (m_buffer[1] == 0x00))
           {
             // utf16LE, we need to put the decoder in LE mode
-            char reverseUtf16[3] = {0xFF, 0xFE, 0x00};
+            char reverseUtf16[3] = {'\xFF', '\xFE', '\x00'};
             m_decoder->toUnicode(reverseUtf16, 2);
           }

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от sunjob

хуже/лучше, правильно/нет?

Нет.

#include <iostream>

#define ABS(N) ((N<0)?(-N):(N))

int main() {
  unsigned int u=-1;
  std::cout << "abs: " << abs((int)u) << ", ABS: " << ABS(u) << "\n";
}

abs: 1,  ABS: 4294967295

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)
Ответ на: комментарий от bormant

По-моему, там с самого начала говнокод.

Deleted
()
Ответ на: комментарий от sunjob

А первая ошибка — вероятно, где-то неверно расположен #include, скорее всего внутри какого-то namespace, как результат, из глобального namespace (::) исчезли необходимые имена, в частности ::abs.

bormant ★★★★★
()
Ответ на: комментарий от bormant

другой вариант

#include <iostream>

#define ABS(N) ((((int)(N))<0)?(-N):(N))

int main() {
  unsigned int u=-1;
  std::cout << "abs: " << abs((int)u) << ", ABS((int)u) " << ABS(u) << "\n";
  std::cout << "abs: " << abs(     u) << ", ABS(     u) " << ABS(u) << "\n";
}
g++ main.cpp && ./a.out

abs: 1, ABS((int)u) 1
abs: 1, ABS(     u) 1

что-то [ code=c++ ] не хрена не работает...

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 5)
Ответ на: комментарий от sunjob

Этот abs — не тот, который std::abs ;-), ему важен только размер параметра на входе, на его знаковость в вызывающем коде ему почти плевать.

#include <iostream>
#define ABS(N) ((N<0)?(-N):(N))

using std::abs; // теперь abs -- это std::abs

int main() {
  unsigned int u=-1;
  std::cout << "abs: " << abs((int)u) << ", ABS: " << ABS(u) << "\n";
}


PS. Ну и предупреждения стоит включить :-D

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 3)
Ответ на: комментарий от bormant

да я про другой шаплон

#define ABS(N) ((((int)(N))<0)?(-N):(N))

Ну и предупреждения стоит включить

а кто-бы их выключил... ни каких пердупержений не было... :о)

может, что не так...

#include <iostream>

#define ABS(N) ((((int)(N))<0)?(-N):(N))
// using std::abs; // теперь abs -- это std::abs

int main()
{
unsigned int u=-1;
std::cout << "    abs((int)u) = " <<      abs((int)u) << "\n";
std::cout << "std:abs((int)u) = " << std::abs((int)u) << "\n";
std::cout << "    ABS((int)u) = " <<      ABS((int)u) << "\n";
std::cout << "    ABS(     u) = " <<      ABS(     u) << "\n";
}

-->

g++ -Wall ./main.cpp && ./a.out
-->
    abs((int)u) = 1
std:abs((int)u) = 1
    ABS((int)u) = 1
    ABS(     u) = 1

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 4)
Ответ на: комментарий от sunjob

я про другой шаплон

не надо так делать. Никогда.

Оно работает только потому, что в исходнике (грубо)
unsigned int foldingList[];
а
sizeof(unsigned int) == sizeof(signed int)

Поменяет кто-то uint на unsigned short int, на unsigned long int — и привет, счастливой отладки.

bormant ★★★★★
()
Ответ на: комментарий от bormant

я что-то непонимаю, видимо, у вас тоже жестко прописан тип

abs((int)foldingList[foldingList.size()-2])

почему, для «расширения кругозора» не использовать?

abs((long int)foldingList[foldingList.size()-2])
...
#define ABS(N) ((((long int)(N))<0)?(-N):(N))

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от sunjob

Потому что, ABS() сильно похоже на универсальную функцию, от которой никто не будет ожидать подлянки с фиксированным размером типа.
А в фрагментах

  TQMemArray<uint> foldingList=textLine->foldingListArray();
  while ( (foldingList.size()>0) && (abs((int)foldingList[foldingList.size()-2])==1) ) {
    foldingList.resize(foldingList.size()-2,TQGArray::SpeedOptim);
  }

  TQMemArray<uint> foldingList=textLine->foldingListArray();
  while ( (foldingList.size()>0) && (abs(static_cast<int>(foldingList[foldingList.size()-2]))==1) ) {
    foldingList.resize(foldingList.size()-2,TQGArray::SpeedOptim);
  }

uint и int находятся в непосредственной близости и видны явно и недвусмысленно.

Пишите код так, как будто поддерживать его будет склонный к насилию психопат, который знает, где вы живёте

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от bormant

смотрел там... ничего интересного :о)

на эту строчку и ругается (*)

#ifdef KSSL_HAVE_SSL
typedef struct x509_st X509;
#else
class X509;  // <-- * this error message
#endif

tde14.x - сильно отличается от tde3.x

...

using typedef-name ‘X509’ after ‘class’

X509 - считается как уже определененный где-то тип? или «накосячено» с препроцессорными условиями... выше

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 6)
Ответ на: комментарий от sunjob

X509 - считается как уже определененный где-то тип?

Сообщение об ошибке буквально о том, что где-то есть
typedef что_то X509;
а при компиляции встречено
class X509;
т.е. попытка опережающего объявления класса с именем, которое уже известно компилятору как typedef.

bormant ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.