在macOS上编译pkgconfig 0.29时遭遇整数与指针类型不兼容转换错误
嘿,我之前在macOS用clang编译pkgconfig 0.29的时候也踩过这个坑!这个错误完全是clang的严格类型检查闹的——pkgconfig依赖的glib相关代码(也就是gatomic.h里的宏)在处理指针和整数转换时,没做好clang下的适配。
先把你碰到的具体错误贴出来方便对照:
gatomic.c:392:10: error: incompatible integer to pointer conversion passing 'gssize' (aka 'long') to parameter of type 'gpointer' (aka 'void *') [-Wint-conversion]
return g_atomic_pointer_add ((volatile gpointer *) atomic, val);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./gatomic.h:170:46: note: expanded from macro 'g_atomic_pointer_add'
(gssize) __sync_fetch_and_add ((atomic), (val));
^~~~~
gatomic.c:416:10: error: incompatible integer to pointer conversion passing 'gsize' (aka 'unsigned long') to parameter of type 'gpointer' (aka 'void *') [-Wint-conversion]
return g_atomic_pointer_and ((volatile gpointer *) atomic, val);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./gatomic.h:177:45: note: expanded from macro 'g_atomic_pointer_and'
(gsize) __sync_fetch_and_and ((atomic), (val))...
本质问题是:__sync_fetch_and_add这类clang内置函数,要求第二个参数的类型和指针类型严格匹配,但源码里的宏直接把整数传进去了,导致类型不兼容报错。
给你三个可行的解决办法,按需选就行:
方法一:修改gatomic.h的宏定义
找到pkgconfig源码里的gatomic.h文件,手动修正对应的宏,把整数参数强制转换成指针类型:
- 针对
g_atomic_pointer_add宏,把(val)改成(gpointer)(val),修改后宏如下:#define g_atomic_pointer_add(atomic, val) \ (gssize) __sync_fetch_and_add ((atomic), (gpointer)(val)); - 同理,
g_atomic_pointer_and宏里把(val)改成(gpointer)(val):#define g_atomic_pointer_and(atomic, val) \ (gsize) __sync_fetch_and_and ((atomic), (gpointer)(val));
强制转换后,clang就不会揪着类型问题不放了。
方法二:编译时添加警告抑制参数
要是不想改源码,就在编译阶段给clang加个参数,让它忽略这个类型转换的警告(这里的转换逻辑是安全的,只是语法上不匹配)。
执行configure的时候带上参数:
./configure CC=clang CFLAGS="-Wno-int-conversion"
再正常执行make,应该就能顺利编译通过了。
方法三:直接升级pkgconfig版本
如果条件允许,最省心的办法是升级到pkgconfig 0.29.2及以后的版本——这些新版本已经修复了macOS clang下的兼容性问题,不用手动折腾代码或参数,直接编译就行。
备注:内容来源于stack exchange,提问作者Arno

