我在Mac OS X主机上运行以下版本的clang:
$ clang -v
Apple LLVM version 8.1.0 (clang-802.0.42)
我有一些代码,使用了C11的aligned_alloc()
函数来分配对齐的内存块。
我正在使用-std=c11
标志编译我的二进制文件:
...
clang -g -Wall -Wextra -mavx -std=c11 -D__USE_POSIX -D__STDC_CONSTANT_MACROS -D__STDINT_MACROS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -O2 -c my_binary.c -o my_binary.o; \
clang -g -Wall -Wextra -mavx -std=c11 -D__USE_POSIX -D__STDC_CONSTANT_MACROS -D__STDINT_MACROS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -O2 my_binary.o -o my_binary -lm; \
...
我正在包含
stdlib.h
并添加POSIX标志。来自my_binary.h
:...
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200809L
#endif /* getline() support */
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 600
#endif /* aligned_alloc() support */
#include <stdlib.h>
...
我收到了以下编译警告:
my_binary.c:245:15: warning: implicit declaration of function 'aligned_alloc' is invalid in C99 [-Wimplicit-function-declaration]
s->data = aligned_alloc(32, s->n * sizeof(*s->data));
这引发了以下错误:
Undefined symbols for architecture x86_64:
"_aligned_alloc", referenced from:
_bs_initialize_signal_avx in my_binary.o
_bs_copy_signal_avx in my_binary.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [build] Error 1
我在使用clang时出了什么问题,导致编译忽略了C11标准的std标记?我能够在一个安装有gcc 5.3.0和glibc 2.22的CentOS 7(Linux)主机上编译不出错。
clang
在这一切中毫无用处。上次我查看时,OS X在支持标准方面远远落后。他们的POSIX版本也相当老旧。 - Jens Gustedt的倍数的对齐方式。这并没有回答你的问题,但或许可以帮到你,你可以尝试使用
posix_memalign`,在我写的一些代码中它表现得很好。 - Todd Lehman