発生条件
- 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
をつけることにした。