Mac OSX编译Skeeter(PostgreSQL/ZeroMQ)失败,报vsnprintf参数声明错误
这个问题我之前在Mac上折腾老C项目的时候也碰到过,本质是Mac的Clang编译器和Ubuntu上的GCC在标准库函数声明的处理逻辑上不一样,尤其是vsnprintf这个函数搞出来的冲突。
问题根源
你看到的错误:
src/bstrlib.c:2762:12: error: expected parameter declarator extern int vsnprintf (char *buf, size_t co...
是因为bstrlib.c里手动声明了vsnprintf,但Mac系统的标准头文件里已经有了符合C标准的正确声明,而且格式和这个手动声明不匹配,导致编译器报错冲突。
具体修复步骤
修改bstrlib.c中的vsnprintf声明
打开项目里的src/bstrlib.c文件,定位到第2762行附近的extern int vsnprintf (...)这段代码,直接把它删掉或者用注释符包裹起来。
原来的代码大概长这样:extern int vsnprintf (char *buf, size_t count, const char *fmt, va_list args);删掉之后编译器就会自动使用系统标准头文件里的正确声明了。
确认标准头文件已包含
检查bstrlib.c的顶部,确保已经包含了<stdio.h>和<stdarg.h>这两个头文件——这俩文件里就有Mac系统正确的vsnprintf声明。如果没加的话,在文件开头补上:#include <stdio.h> #include <stdarg.h>重新编译
回到项目根目录,重新运行make命令,应该就能顺利编译通过了。
额外小提示
要是之后还碰到类似的标准库函数声明冲突(比如snprintf这类),都可以用同样的思路解决:删掉手动加的extern声明,依赖系统标准头文件里的版本就行。Mac的Clang对C标准的遵循更严格,老项目里为了兼容旧版GCC写的手动声明反而容易踩坑。
内容的提问来源于stack exchange,提问作者Zeruno

