我有点不解。我有我编译的项目
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
但编译通过。虽然mkdtemp
确实返回非 NULL 路径,但访问它会导致 EXC_BAD_ACCESS。
问题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
...但这感觉就像一个丑陋的黑客。