[转]gcc提示未知类型pthread_spinlock_t
原文地址:gcc提示未知类型 pthread_spinlock_t
只要遇到的问题多,天天都能水博客
之前遇到一个问题 link,解决方案是改成 -std=gnu99
,这是前提
这次我用到了pthread_spinlock
,实现个简单的队列,我在 redis 的 makefile 中改了,但是编译还是提示
error: unknown type name 'pthread_spinlock_t'
pthread_spinlock_t head_lock;
经过我走读 makefile,发现 src/.make-settings
文件中有缓存之前的编译配置,导致make还是按照 -std=c99 编译的,手动改成 -std=gnu99
就好了。
注意
- 这降低了可移植性。(macos 貌似没有 spinlock?)
- 需要了解 redis makefile 流程。可能是大家都觉得简单,没见有人讲这个。
参考
- gcc使用 spinlock https://stackoverflow.com/questions/13661145/using-spinlocks-with-gcc
- features.h https://github.com/bminor/glibc/blob/0a1f1e78fbdfaf2c01e9c2368023b2533e7136cf/include/features.h#L154-L175
- __USE_XOPEN2K 定义,实际上和GNU相关。https://stackoverflow.com/questions/33076175/why-is-struct-addrinfo-defined-only-if-use-xopen2k-is-defined
- 解释__USE_XOPEN2K https://stackoverflow.com/questions/13879302/purpose-of-use-xopen2k8-and-how-to-set-it
__GNU_SOURCE
和___USE_GNU
区别 https://blog.csdn.net/robertsong2004/article/details/52861078- 简单说,有
_GNU_SOURCE
就有__USE_GNU
,一个内部用,一个外部用,指定编译选项gnu也会启用 - g++ 默认编译带GNU,gcc 不带
- 简单说,有
- 介绍
__GNU_SOURCE
和__USE_GNU
https://stackoverflow.com/questions/7296963/gnu-source-and-use-gnu - 一个-std=c99报错,rwlock也不是标准的,需要pthread.h,也得用gnu https://stackoverflow.com/questions/15673492/gcc-compile-fails-with-pthread-and-option-std-c99
- spinlock manpage ,注意
_POSIX_C_SOURCE >= 200112L
http://man7.org/linux/man-pages/man3/pthread_spin_lock.3.html