Végre valami nyomoznivaló: #error unsupported size of off_t

Ezt mondja a php-5.6.18 egy AIX6.1-en


/usr/local/src/php-5.6.18/ext/zip/lib/zipint.h:118:2: error:
#error unsupported size of off_t

Egyelőre fogalmam sincs, hogy ez mi lehet, akár még az is lehet, hogy az egyik komponens római számot vár (VIII), a másik meg azt adja, hogy "EIGHT", ezért nem találkoznak...

20160208.1354: Nem egészen, azt írta valami nagyon okos script a main/php_config.h-ba, hogy:


/* The size of `off_t', as computed by sizeof. */
#define SIZEOF_OFF_T 0

20160208.1402: Jaja, configure írta is:


checking size of long long... (cached) 8
checking size of off_t... 0
checking size of size_t... (cached) 8

20160208.1409: Hát kérem, ha nem nézem rosszul, akkor a gcc-nek ez a korszerűtlen 4.8.3-as verziója megeszi azt, hogy sizeof (ssize_t), de nem tetszik neki az, hogy sizeof ((ssize_t))

Példa:


    size_t s= 0;

    s += sizeof (ssize_t);   /* ez jó */
    s += sizeof ((ssize_t)); /* ez nem */

    return 0;

20160208.1420: És ez még csak nem is a hiba oka, csak amolyan érdekesség!

20160208.2030: Ez csak amolyan óvatosság a configure részéről: ha a compiler nem szeretné a sizeof (xtipus) -t, esetleg még mindig szeretheti a sizeof ((xtipus)) -t. Hát biztos.

Hozzászólások

Ez ugye ma történt és nem tavaly;)

sizeof (ssize_t) es sizeof ((ssize_t)) esete sztem teljesen ertheto.
Masodik esetben a (ssize_t) kiertekelodik forditasi idoben es arra hivnad meg forditasi idoben a sizeof-ot.
Ez igy persze hogy nem mukodhet sok dolog miatt.

A ssize_t nem nagyon tud kiértékelődni, mivel ő egy typedef az 'unsigned long'-ra (LP64-ban vagyunk, tehát ez jó így); ugyanez a szintaxis más típusra is hibás:


    s += sizeof (ssize_t);   /* ez jó */
    s += sizeof ((ssize_t)); /* ez nem */

    s += sizeof (int);   /* ez jó */
    s += sizeof ((int)); /* ez nem */

proba1.c:11:27: error: expected expression before ')' token
     s += sizeof ((ssize_t)); /* ez nem */
                           ^
proba1.c:14:23: error: expected expression before ')' token
     s += sizeof ((int)); /* ez nem */

Na szóval a LDFLAGS állt rosszul, a ./configure meg egyes conftest-programokat LDFLAGS-sal fordított, másokat meg anélkül, az előbbiek nem sikerültek, az utóbbiak igen.