私は少し困惑しています。コンパイルするプロジェクトがあります
CFLAGS=-g -O2 -Wall -Wextra -Isrc/main -pthread -rdynamic -DNDEBUG $(OPTFLAGS) -D_FILE_OFFSET_BITS=64 -D_XOPEN_SOURCE=700
今、私は使用したいmkdtemp
ので、含めますunistd.h
char *path = mkdtemp(strdup("/tmp/test-XXXXXX"));
MacOSX では、コンパイルでいくつかの警告が表示されます
warning: implicit declaration of function ‘mkdtemp’
warning: initialization makes pointer from integer without a cast
しかし、コンパイルは通ります。NULL 以外のパスにアクセスすると、 EXC_BAD_ACCESSmkdtemp
が返されます。
質問 1: テンプレートがstrdup()
ed で、結果が非 NULL です。いったいどうしてこれが EXC_BAD_ACCESS になるのでしょうか?
ウサギの穴をさらに下ります。警告を取り除きましょう。チェックunistd.h
すると、プリプロセッサによって隠されている宣言が見つかりました。
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
...
char *mkdtemp(char *);
...
#endif
ビルドに追加-D_DARWIN_C_SOURCE
すると、すべての問題が解消されますが、プラットフォーム固有のビルドが残ります。10.6のマニュアルページには、
Standard C Library (libc, -lc)
#include <unistd.h>
ビルドメイクからの削除は_XOPEN_SOURCE
OSXでは機能しますが、Linuxではコンパイルに失敗します
warning: ‘struct FTW’ declared inside parameter list
warning: its scope is only this definition or declaration, which is probably not what you want
In function ‘tmp_remove’:
warning: implicit declaration of function ‘nftw’
error: ‘FTW_DEPTH’ undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
error: ‘FTW_PHYS’ undeclared (first use in this function)
質問 2: では、これをどのように修正しますか?
私が見つけた唯一の修正は、#undef
インクルードの直前に _POSIX_C_SOURCE するunistd.h
ことです...しかし、それは醜いハックのように感じます。