使用gSOAP代码框架开发onvif时,由于我用的是lighttpd做前端web server,用gsoap生成的代码做后端,使用fastcgi进行连接。
不过发现gsoap的代码的debug支持在使用fastcgi的情况下无效了,经检查,发现问题是引用的fcgi_stdio.h里面的宏定义冲掉了原本写log的操作。
// fcgi_stdio.h #define fprintf FCGI_fprintf这样一来,原本写log的语句就变成了
DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); //gcc -DWITH_FASTCGI -E stdsoap2.c { if (soap) { if (!soap->fdebug[(2)]) soap_open_logfile((struct soap*)soap, (2)); if (soap->fdebug[(2)]) { FCGI_FILE *fdebug = soap->fdebug[(2)]; FCGI_fprintf(fdebug, "Mo ..."); FCGI_fflush(fdebug); } }};所以log功能无效了。
解决这个问题的方法很简单,fcgi_stdio.h里有个宏开关NO_FCGI_DEFINES,用来关闭这些替换
不过这样一来,有一些原本要替换掉的宏反而无效了,这里需要把这些要替换掉的宏找出来,手动替换成FCGX_xxx.
在2.8.15的版本上,我做的修改是:
stdsoap2.c
680,687c680,682 < #if defined(WITH_FASTCGI) < #if defined(NO_FCGI_DEFINES) < nwritten = FCGI_fwrite((void*)s, 1, n, (&_fcgi_sF[1])); < FCGI_fflush((&_fcgi_sF[1])); < #else < nwritten = fwrite((void*)s, 1, n, stdout); < fflush(stdout); < #endif --- > #ifdef WITH_FASTCGI > nwritten = fwrite((void*)s, 1, n, stdout); > fflush(stdout); 1000,1003c995 < #if defined(WITH_FASTCGI) < #if defined(NO_FCGI_DEFINES) < return FCGI_fread(s, 1, n, (&_fcgi_sF[0])); < #else --- > #ifdef WITH_FASTCGI 1005d996 < #endif 5047,5049d5037 < #if defined(WITH_FASTCGI) && defined(NO_FCGI_DEFINES) < { if (soap->FCGI_fclose && (soap->error = soap->FCGI_fclose(soap))) < #else 5051d5038 < #endif 5160,5163d5146 < #ifdef NO_FCGI_DEFINES < soap->FCGI_fopen = tcp_connect; < soap->FCGI_fclose = tcp_disconnect; < #else 5166d5148 < #endif 7520,7522d7501 < #ifdef NO_FCGI_DEFINES < FCGI_fprintf((&_fcgi_sF[2]), "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); < #else 7524d7502 < #endif 8838,8841d8815 < #ifdef NO_FCGI_DEFINES < soap->FCGI_fopen = tcp_connect; < soap->FCGI_fclose = tcp_disconnect; < #else 8844d8817 < #endif 12880a12854 > 15422,15424d15395 < #if defined(WITH_FASTCGI) && defined(NO_FCGI_DEFINES) < if (soap->FCGI_fopen && *soap->host) < #else 15426d15396 < #endif 15440,15442d15409 < #if defined(WITH_FASTCGI) && defined(NO_FCGI_DEFINES) < { soap->socket = soap->FCGI_fopen(soap, endpoint, soap->host, soap->port); < #else 15444d15410 < #endif
stdsoap2.h
768,769c764 < #define NO_FCGI_DEFINES < #include "fcgi_stdio.h" --- > # include <fcgi_stdio.h> 1942,1944d1936 < #ifdef NO_FCGI_DEFINES < int (*FCGI_fopen)(struct soap*, const char*, const char*, int); < #else 1946d1937 < #endif 1948,1950d1938 < #ifdef NO_FCGI_DEFINES < int (*FCGI_fclose)(struct soap*); < #else 1952d1939 < #endif