[make] static declaration follows non-static e.a.

Pagina: 1
Acties:

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
Wanneer ik PHP 4.1.2 compile met GD 1.8.4 ( zonder GD ging het daarvoor feilloos ) krijg ik deze foutmelding:
In file included from gd.c:36:
php_gd.h:69: warning: static declaration for `gdImageColorResolve' follows non-static
gd.c:92: conflicting types for `gdIOCtx'
/usr/local/gd/include/gd_io.h:18: previous declaration of `gdIOCtx'
make[3]: *** [gd.lo] Error 1
make[3]: Leaving directory `/root/src/php-4.1.2/ext/gd'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/root/src/php-4.1.2/ext/gd'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/src/php-4.1.2/ext'
make: *** [all-recursive] Error 1
Nu heb ik gezocht op Google en is de enige oplossing die gegeven wordt deze:
i've had the same problem since 4.0x...eventually i just gave up trying to
compile with gd support.If anyone has a better step by step instruction page
than the ones i've tried please let us know ;)
bron: http://news.php.net/article.php?group=php.install&article=5706
Beetje jammer dus.

Daarnaast helpt dit een eind op weg:
Compiling PHP3 now gives the following warning (using gd 1.5):

functions/gdttf.c:165: warning: static declaration for `gdImageColorResolve' follows non-static

because the prototype in line 153 says

int gdImageColorResolve(...)

and the function declaration in line 163 says

static int gdImageColorResolve(...)

Another thought: Why is this function present in gdttf.c as well as in
gd.c? Isn't gd.c always used with gdttf.c?
bron: http://www.phpbuilder.com/mail/php-developer-list/199911/0798.php
Effe de betrokken bestanden greppen op de genoemde functies en variabelen:

GD includes:
gd.h:
code:
1
2
3
[..]
int gdImageColorResolve(gdImagePtr im, int r, int g, int b);
[..]

gd_io.h:
code:
1
2
3
4
5
6
7
8
9
10
11
[..]
typedef struct gdIOCtx {
      int     (*getC)(struct gdIOCtx*);
      int     (*getBuf)(struct gdIOCtx*, void*, int);
      void     (*putC)(struct gdIOCtx*, int);
      int     (*putBuf)(struct gdIOCtx*, const void*, int);
      int     (*seek)(struct gdIOCtx*, const int);
      long    (*tell)(struct gdIOCtx*);
      void    (*free)(struct gdIOCtx*);
} gdIOCtx;
[..]

PHP stuff:
php_gd.h:
code:
1
2
3
[..]
static int gdImageColorResolve(gdImagePtr, int, int, int);
[..]

gd.c:
code:
1
2
3
[..]
typedef FILE gdIOCtx;
[..]

Zoals jullie zien worden gdImageColorResolve() en gdIOCtx dubbel en verschillend gedeclareerd.

Nu snap ik dat er hier iets moet gebeuren, dus wat zouden jullie doen, wat moet aan wat worden aangepast?

Subtiele hints of complete codefragmenten zijn welkom. :)

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Die typedef is volkomen legaal in C hoor :)
code:
1
static int gdImageColorResolve(gdImagePtr, int, int, int);

* stylee 's C kennis is een beetje roestig...

Kan iig niet bedenken waar die static voor zou moeten dienen :)

Zet er anders gewoon eens een static voor, kijk wat er gebeurt.

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
Op zaterdag 23 maart 2002 22:33 schreef stylee het volgende:
Die typedef is volkomen legaal in C hoor :)
Nee, want even daarvoor (of daarna, heb de Makefile nog niet helemaal uitgepluist) wordt gdIOCtx zo gedeclareerd:
code:
1
2
3
4
5
6
7
8
9
typedef struct gdIOCtx {
      int     (*getC)(struct gdIOCtx*);
      int     (*getBuf)(struct gdIOCtx*, void*, int);
      void     (*putC)(struct gdIOCtx*, int);
      int     (*putBuf)(struct gdIOCtx*, const void*, int);
      int     (*seek)(struct gdIOCtx*, const int);
      long    (*tell)(struct gdIOCtx*);
      void    (*free)(struct gdIOCtx*);
} gdIOCtx;
code:
1
static int gdImageColorResolve(gdImagePtr, int, int, int);

Kan iig niet bedenken waar die static voor zou moeten dienen :)

Zet er anders gewoon eens een static voor, kijk wat er gebeurt.
Ik pas die PHP code dan maar aan aan de GD code ( die static weghalen dus ), en dan post ik zo wel mijn bevindingen. :)

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Ericston: Nee, want even daarvoor (of daarna, heb de Makefile nog niet helemaal uitgepluist) wordt gdIOCtx zo gedeclareerd...

Een typedef geeft alleen maar een 'alias' aan voor een bepaalde type.

Als je eerst een struct had gedeclareerd van het type gdIOCtx en je wilt nu deze definiëren (of was het eerst definiëren en dan declareren.. raak hier altijd mee in de knoop :D) dan zou je zoiets schrijven:
code:
1
gdIOCtx a;

Nu is gdIOCtx niet echt leuk om te schrijven maar FILE weer wel, dus maken ze er een alias van.
code:
1
2
3
4
typedef FILE gdIOCtx; // je zou bijv ook kunnen schrijven
                // typedef FILE int;
FILE a;        // zelfde als 
                // gdIOCtx a;

Lang geleden dat ik C heb gedaan maar zal zo ongeveer wel kloppen, voor vragen enzo maar ff aankloppen in het gezellige /14 :P

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
Op zaterdag 23 maart 2002 22:52 schreef stylee het volgende:
code:
1
2
3
4
typedef FILE gdIOCtx; // je zou bijv ook kunnen schrijven
                // typedef FILE int;
FILE a;        // zelfde als 
                // gdIOCtx a;

Lang geleden dat ik C heb gedaan maar zal zo ongeveer wel kloppen, voor vragen enzo maar ff aankloppen in het gezellige /14 :P
Hmm, volgens K&R is het precies andersom. :)

Ik heb nu van...
code:
1
static int gdImageColorResolve(gdImagePtr, int, int, int);

...in php_gd.h, dit gemaakt...
code:
1
int gdImageColorResolve(gdImagePtr, int, int, int);

En bij...
code:
1
typedef FILE gdIOCtx

...stond dit...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#if HAVE_LIBGD15
/* it's >= 1.5, i.e. has IOCtx */
#define USE_GD_IOCTX 1
#else
#undef USE_GD_IOCTX
#endif

#ifdef USE_GD_IOCTX
#include "gd_ctx.c"
#else
#define gdImageCreateFromGdCtx  NULL
#define gdImageCreateFromGd2Ctx     NULL
#define gdImageCreateFromGd2partCtx NULL
#define gdImageCreateFromGifCtx     NULL
#define gdImageCreateFromJpegCtx    NULL
#define gdImageCreateFromPngCtx     NULL
#define gdImageCreateFromWBMPCtx    NULL
typedef FILE gdIOCtx;
#define CTX_PUTC(c, fp) fputc(c, fp)
#endif

...in gd.c. Nu heb ik dit gemaakt...
code:
1
2
3
4
5
6
7
8
#if HAVE_LIBGD15
/* it's >= 1.5, i.e. has IOCtx */
#define USE_GD_IOCTX 1
#else
#undef USE_GD_IOCTX
#endif

#include "gd_ctx.c"

...omdat ik GD 1.8.3 heb, en die typedef eigenlijk niet mag gebeuren doordat er een onduidelijke fout in die #if stuff zit. Waarschijnlijk is HAVE_LIDGD15 ten onrechte false.

Iig, het compileert...
...ship it. :)

* Ericston weet trouwens hoe gezellig /14 is. :)

Was deze thread eigenlijk wel nodig? Naja, het staat in ieder geval op het net nu. :+