発生条件
- CppUTestでメモリリークをチェックしたかったので強制インクルード
-includeを使ってヘッダファイルを指定していた。 - GNU非標準拡張の
pthread_tryjoin_npを使用するため、ソースの先頭で#define _GNU_SOURCEと定義していた
現象
error: implicit declaration of function ‘pthread_tryjoin_np’
pthread_tryjoin_npが見つからないと言われる。
#include <pthread.h>よりも前に_GNU_SOURCEを定義してあるので使える筈なのに。
調査方法
- 試しに
#define _GNU_SOURCEをやめてコンパイルオプション-D_GNU_SOURCEを与えたらビルドできた - コンパイル時に
-Eオプションをつけて、プリコンパイル時点でソースがどんな風に見えているかを調べた
判明した原因
_GNU_SOURCEは、間接的にインクルードされるfeatures.hよりも前に定義しておかなければ意味がない。
ソースの先頭で_GNU_SOURCEを定義していたが、-includeで与えたヘッダの延長でfeatures.hが読み込まれたため、_GNU_SOURCEが利かなくなっていた。
対処
コンパイルオプション-D_GNU_SOURCEをつけることにした。