Windows下asprintf隐式声明警告排查:本地正常同事环境报错
问题:Windows环境下asprintf隐式声明警告导致程序运行失败
我开发了一个将PHP代码转换为可运行C文件的程序,用于调用PHP函数。该程序在我的Windows 10系统上运行正常,但在同事的Windows 10系统上运行失败。由于Windows原生不支持asprintf函数,我在头文件asprintf.h中自行实现了该函数。
asprintf.h 代码
#ifndef ASPRINTF_H #define ASPRINTF_H #if defined(__GNUC__) && ! defined(_GNU_SOURCE) #define _GNU_SOURCE /* needed for (v)asprintf, affects '#include <stdio.h>' */ #endif #include <stdio.h> /* needed for vsnprintf */ #include <stdlib.h> /* needed for malloc, free */ #include <stdarg.h> /* needed for va_* */ /* * vscprintf: * MSVC implements this as _vscprintf, thus we just 'symlink' it here * GNU-C-compatible compilers do not implement this, thus we implement it here */ #ifdef _MSC_VER #define vscprintf _vscprintf #endif #ifdef __GNUC__ int vscprintf(const char *format, va_list ap) { va_list ap_copy; va_copy(ap_copy, ap); int retval = vsnprintf(NULL, 0, format, ap_copy); va_end(ap_copy); return retval; } #endif /* * asprintf, vasprintf: * MSVC does not implement these, thus we implement them here * GNU-C-compatible compilers implement these with the same names, thus we * don't have to do anything */ #ifdef _MSC_VER int vasprintf(char **strp, const char *format, va_list ap) { int len = vscprintf(format, ap); if (len == -1) return -1; char *str = (char*)malloc((size_t) len + 1); if (!str) return -1; int retval = vsnprintf(str, len + 1, format, ap); if (retval == -1) { free(str); return -1; } *strp = str; return retval; } int asprintf(char **strp, const char *format, ...) { va_list ap; va_start(ap, format); int retval = vasprintf(strp, format, ap); va_end(ap); return retval; } #endif #endif // ASPRINTF_H
main.c 代码
#include "asprintf.h" #include <stdio.h> #include <stdlib.h> extern char _binary_script_php_start; extern char _binary_script_php_end; int main(int argc, char *argv[]) { // EXTRACT OUR RESOURCE OBJECT INTO /tmp/test.php char *p = &_binary_script_php_start; FILE *fp = fopen("/tmp/test.php","wb"); while ( p != &_binary_script_php_end ) { fputc(*p++,fp); } fclose(fp); // NOW READ IN OUR STANDARD ARGUMENTS AND LAUNCH OUR COMMAND int i = 1; char *cmd = "php /tmp/test.php"; char *s = NULL; asprintf(&s, "%s",cmd); for(i = 1; i < argc; i++) { asprintf(&s, "%s \"%s\"",s,argv[i]); } // concatf("%s",cmd); // for(i = 1; i < argc; i++) { // concatf("%s \"%s\"",s,argv[i]); // } // concatf(&s, "%s",cmd); // for(i = 1; i < argc; i++) { // concatf(&s, "%s \"%s\"",s,argv[i]); // } system(s); free(s); unlink("/tmp/test.php"); // comment me out for debugging if you want }
错误复现与疑问
我通过创建新头文件并修改函数名的方式复现了同事的错误:同事那边收到的警告是 warning: implicit declaration of function 'asprintf' [-Wimplicit-function-declaration],而我修改后收到类似的 warning: implicit declaration of function 'concatf' 警告。
我清楚函数需要在main函数前声明,且已在头文件中完成;也知道需要定义_GNU_SOURCE,这一点在头文件中也已处理。我想知道是否存在未遵守的规则,以及为何该程序在我的环境中正常运行,在同事环境中却报错?
编译运行步骤
- 创建名为
script.php的PHP文件 - 执行以下命令:
ld -r -b binary script.php data.o gcc main.c data.o -o runme - 正常情况下,执行
./runme即可运行该PHP文件
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

